# Pragma Engine

# Introduction

### [![pragma_logo_256.png](https://wiki.pragma-engine.com/uploads/images/gallery/2022-09/scaled-1680-/pragma-logo-256.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2022-09/pragma-logo-256.png)What is Pragma?

[![youtube_social_square_red32.png](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/scaled-1680-/youtube_social_square_red32.png)](https://www.youtube.com/channel/UCGJJGA9ATcLr4wc5OEHXIyA/videos) [![Discord-Logo-Color.png](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/Discord-Logo-Color.png)](https://discord.gg/Ck5BcCz)

Pragma is a free, [open source](https://github.com/Silverlan/pragma) custom game engine written in C++. Here is an overview over some of its core features:

- Support for various **Source Engine** and **Source 2** assets, such as: maps, models, materials, textures, sound-script files and particle systems
- Extensive modding support with Lua (with Live-coding, debugging-support with the [ZeroBrane IDE](https://studio.zerobrane.com/), support for custom shaders, custom entities/weapons/NPCs/vehicles, etc)
- Support for PBR (**p**hysically **b**ased **r**endering)
- Support for the Cycles-renderer (the same as used by Blender)
- Multiplayer-support, including dedicated servers
- Steam Workshop support
- VR support
- Support for the Bullet and PhysX physics engines
- Support for OpenGL and Vulkan
- AI-system based on behavior trees
- Entity-component-system
- Steam Audio support for [spatial audio](https://youtu.be/hY2BSht_goI)
- etc.

<p class="callout warning">Pragma is currently in an early beta, some features may not be fully functional at the moment or are unfinished/experimental.</p>

Pragma also ships with the [Pragma Filmmaker](https://wiki.pragma-engine.com/books/pragma-filmmaker/page/getting-started), an open source alternative to the Source Filmmaker.

You can use the Book Navigation on the left to navigate to the next page, which has details on how to download and install Pragma.

Click the [![firefox_2020-08-12_15-57-16.png](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/scaled-1680-/firefox_2020-08-12_15-57-16.png)](https://wiki.pragma-engine.com/shelves) button at the top right for other topics (such as the API documentation for developers).

### Media

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/P7B-_zMSXmA" width="560"></iframe>

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/pJJn6e1sgP0" width="560"></iframe>

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/G1JvibPFnyE" width="560"></iframe>

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/8WvvnuhDgwM" width="560"></iframe>

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/4GRMOU-CdEQ" width="560"></iframe>

# Download

### System requirements

- **Operating System:** Windows 10 (or newer) / Ubuntu 22.04 LTS (or newer)
- **Memory:** 4 GiB RAM or more
- **Graphics card:** GTX 1050 Ti or newer

### Download

##### Standalone

[![download.png](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/firefox_2020-08-14_10-46-44.png)](https://github.com/Silverlan/pragma/releases/latest)

Download the "-win64.zip" version if you're on a Windows OS, and "-lin64.tar.gz" for Linux.  
No installation is required, simply extract the archive somewhere and run the "pfm.exe".

##### Source Code

[Pragma](https://github.com/Silverlan/pragma) and [PFM](https://github.com/Silverlan/pfm) are both completely open-source on GitHub, which means you can also build them yourself. For more information, check out [this article](https://wiki.pragma-engine.com/books/pragma-engine/page/building-pragma).

# Changelog

See [progress reports](https://wiki.pragma-engine.com/books/supporters/chapter/posts) for a showcase of new features.

### Version 1.0.5 \[2022-08-30\]

##### Filmmaker v0.4.6

- Added Pragma Renderer 
    - Added SSAA
    - Added motion blur
    - Added directional light maps
    - Added volumetric spot-lights
    - Virtual Reality support
- Added new [transform gizmo system](https://wiki.pragma-engine.com/books/pragma-filmmaker/page/viewport#bkmrk-move)
- Added/Improved viewport actor interaction
- Added undo-redo system
- Added [decals](https://wiki.pragma-engine.com/uploads/images/gallery/2022-08/scaled-1680-/pragma-2022-08-27-16-34-24.png)
- Added [tutorials](https://wiki.pragma-engine.com/books/pragma-filmmaker)
- Added option for importing map into project
- Added new actor context menu options
- Added support for rendering legacy Eye shader with Cycles X
- General UI improvement updates
- Significantly improve quality of baked lightmaps
- Added components: 
    - pfm\_baked\_lighting
    - pfm\_cuboid\_bounds
    - pfm\_pragma\_renderer
    - pfm\_motion\_blur
    - pfm\_rt\_mover
    - pfm\_overlay\_object
    - pfm\_camera\_actor\_link
    - pfm\_selection\_wireframe
    - pfm\_cone\_wireframe

##### Engine

- Added motion blur effect
- Added object BVH system for fast scene intersection tests
- Added directional lightmap baking
- Improved volumetric spot-light effect
- Fixed bloom effect appearing stretched on widescreen resolutions
- Fixed white edges around objects with masked alpha transparency
- Added entity components: 
    - renderer\_pp\_bloom, renderer\_pp\_dof, renderer\_pp\_fog, renderer\_pp\_fxaa, renderer\_pp\_tone\_mapping
    - optical\_camera
    - bvh, static\_bvh\_cache, static\_bvh\_user
    - light\_map\_data\_cache
- Fixed various crashes

##### Lua

- Added table.count, table.is\_empty
- Added gui.Element:FindAncestorByClass, :SetAutoSizeToContents, :UpdateAutoSizeToContents, :ShouldAutoSizeToContentsX, :ShouldAutoSizeToContentsY
- Added game.Model:GetEyeball, .Load
- Added ents.EyeComponent:FindEyeballIndex, :GetEyeballProjectionVectors
- Added ents.ClickComponent.find\_entities\_in\_kdop
- Added ents.BvhComponent:IntersectionTestKDop
- Added ents.BaseBhvComponent:RebuildBvh, :FindPrimitiveMeshInfo, .HitInfo:CalcHitNormal
- Added ents.DecalComponent:ApplyDecal
- Added util.ImageBuffer:SetPixelColor
- Added game.Model.Mesh.Sub:HasVertexWeights
- Added python library
- Added prosper.util.record\_resize\_image, .create\_generic\_image\_descriptor\_set
- Added Model.Mesh.Sub:MakeVerticesUnique, :SetVertices, :SetIndices
- Added asset.get\_asset\_state
- Added vector.calc\_spherical\_stereo\_transform
- Added ents.LightMapComponent.DataCache:GetInstanceIds, :GetInstancePose
- Added ents.BaseEnvLightSpotComponent:CalcConeFalloff, :CalcDistanceFalloff
- Added ents.BaseEnvLightPointComponent:CalcDistanceFalloff
- Added util.ThreadPool:WaitForCompletion
- Added ents.citerator, ents.get\_all\_c, ents.IteratorFilterFunction
- Added classes ents.LightMapDataCacheComponent, ents.LightMapComponent.DataCache

### Version 1.0.4 \[2022-05-31\]

##### Filmmaker v0.4.5

- Replaced Cycles with Cycles X (With OptiX and OptiX denoising)
- Significantly improved performance of live raytracing render
- Live raytracing render now automatically updates on certain scene changes (e.g. lighting)
- Graph Editor is now mostly functional and can be used for animating
- Added internal [Web-Browser](https://wiki.pragma-engine.com/books/pragma-filmmaker/page/downloading-and-importing-assets#bkmrk-web-browser) which automatically detects and imports downloaded assets
- Added new project file format (old format is no longer supported)
- Added reflection probe and lightmap baking
- Added option to copy/paste and share actors with animation data between projects
- Added secondary and tertiary viewports
- Significantly reduce real-time peformance impact of retargeted actors
- Sky settings have been moved to "sky" actor component to allow animating sky properties
- Sky overrides and angles can now be previewed in the game viewport
- Actors and actor components can now be removed
- Improved asset explorer filter
- "emission\_factor" entry field in material editor is now a color field instead of a simple slider
- General load and save performance improvements
- Added quicksave and autosave
- Added new rebindable hotkey system and default hotkeys
- Bones can now be animated with transform widgets in 3D viewport
- Support for volumetric spotlights when rendering with Cycles
- Generated model asset icons now zoom in and focus on the character head for character models
- Added IK configs, IK posing and animating with IK
- Actors can now be right-clicked in game viewport to edit materials directly
- Fixed timeline zoom issues and improved zooming behavior
- Fixed incorrect camera FOV values when importing a SFM session
- Lots of crash, interface, general bug fixes, improvements and QOL changes


##### Engine

- Added support for meshes with more than 65535 vertices
- Significantly improved asset loading times
- Added model asset import support for formats: blend, fbx, dae, x3d, obj, abc, usd, pmx (MMD)
- Assets can now be automatically detected and imported from archive files
- Added support for Source Engine ["Eyes" shader](https://developer.valvesoftware.com/wiki/Eyes)
- Added support for "$alpha" VMT parameter
- Added console commands: 
    - asset\_multithreading\_enabled
    - asset\_file\_cache\_enabled
    - render\_enable\_verbose\_output
    - debug\_dump\_font\_glyph\_map
    - locale\_localize
    - util\_convert\_cubemap\_to\_equirectangular\_image
    - util\_convert\_equirectangular\_image\_to\_cubemap
- Added "-console" launch parameter arguments: "gui", "guid"
- Console command launch parameters that appear after "+map" are now executed after the map has been loaded
- Added entity components: 
    - game\_animation\_player, game\_animation\_recorder
    - func\_portal, portal
    - liquid\_surface, liquid\_volume, buoyancy, surface, liquid
    - weapon\_physcannon
    - wireframe\_camera
- Added maps: test\_3d\_skybox, test\_ai\_nav, test\_fog, test\_mirror, test\_physics, test\_portal, test\_water, test\_particles
- Added gravity gun script
- Added support for rotating GUI elements
- Added support for UTF8 fonts and localization
- Added "local view target factor" for controlling character eyes
- Updated particle system to new renderer 
    - Various blob particle improvements
- Fixed water buoyancy physics
- Fixed fog not rendering
- Fixed 3D skybox not rendering
- Fixed water not rendering
- Fixed issue where light source could appear as turned on despite being turned off or removed previously
- Fixed crash when loading models with custom activity names
- Added Fortress Forever to default mount list
- Added support for equirectangular skyboxes and sky angles
- Fixed crash when attempting to export model asset with invalid flex rules
- Fixed some model meshes not being rendered
- Maps in new-game menu are now split into native maps and external maps
- General performance improvements
- Spot-light inner cone angle has been replaced with blend fraction
- Spot-light outer cone angle has been changed from half-angle to full-angle
- prop\_dynamic entities no longer spawn with physics
- General crash fixes and improvements

##### Lua

- Lua-defined component members can now be animated
- Add "prepared render command buffer" system for issuing multi-threaded render commands
- Component member flags can now be specified as strings
- Added Component member meta data information
- Added function bindings:  
    
    - asset.find, asset.clear\_unused, asset.normalize\_asset\_name, asset.load, asset.reload, asset.precache, asset.is\_supported\_extension, asset.wait\_until\_loaded, asset.wait\_until\_all\_pending\_jobs\_complete, asset.poll, asset.poll\_all
    - ents.Entity:GetUri, :GetMemberValue, :SetMemberValue, :DebugPrintComponentProperties
    - ents.EntityComponent:Log, :GetUri, :GetMemberUri, :GetDynamicMemberIndices, :GetStaticMemberCount, :GetMemberIndices
    - ents.ModelComponent:ReloadRenderBufferList, :IsDepthPrepassEnabled, :SetDepthPrepassEnabled, :IsAutoLodEnabled, :SetAutoLodEnabled
    - ents.BaseEnvLightSpotComponent:GetBlendFractionProperty, :GetOuterConeAngleProperty, :GetConeStartOffsetProperty
    - ents.CameraComponent:GetFocalDistance, :SetFocalDistance, :GetFocalDistanceProperty
    - ents.PanimaComponent:DebugPrint, :GetCurrentTime, :SetCurrentTime, :GetCurrentTimeFraction, :SetCurrentTimeFraction, :ReloadAnimation
    - ents.LightComponent:SetLightIntensityType, :SetLightIntensity
    - ents.ReflectionComponent:GetLocationIdentifier, :GenerateFromEquirectangularImage
    - ents.LightComponent:IsBaked, :SetBaked
    - ents.add\_component\_creation\_listener
    - ents.find\_installed\_custom\_components, ents.get\_registered\_entity\_types
    - ents.RenderComponent:IsInPvs
    - ents.TransformComponent:Teleport
    - ents.WorldComponent:RebuildRenderQueues
    - ents.ModelComponent:UpdateRenderMeshes
    - file.is\_empty
    - debug.render\_mesh
    - game.get\_number\_of\_scenes\_queued\_for\_rendering, game.get\_queued\_scene\_render\_info, game.set\_gameplay\_control\_camera, game.reset\_gameplay\_control\_camera, game.get\_gameplay\_control\_camera, game.clear\_gameplay\_control\_camera, game.get\_primary\_camera\_render\_mask
    - geometry.calc\_rect\_circle\_touching\_position
    - gui.create\_render\_target, gui.create\_color\_image, gui.register\_default\_skin, gui.set\_focus\_enabled, gui.is\_focus\_enabled
    - game.DrawSceneInfo:AddSubPass
    - gui.Base:CheckPosInBounds
    - gui.DropDownMenu:FindOptionIndex
    - gui.Element:GetRelativePos, :SetLocalAlpha, :GetLocalAlpha, :IsRemovalScheduled, :ResetRotation, :GetRotationMatrix, :SetRotation, :SetStencilEnabled, :IsStencilEnabled, :SetLocalRenderTransform, :ClearLocalRenderTransform, :DrawToTexture, :GetLocalRenderTransform, :AnchorWithMargin, :ClearFocus, :SetParentAndUpdateWindow
    - gui.Text:GetTextHeight, :UpdateSubLines, :SetMaxLineCount, :GetMaxLineCount
    - gui.Shape:ClearBuffer, :SetShape, :GetBuffer, :SetBuffer, :GetVertexCount
    - gui.WIContextMenu:IsPopulated
    - gui.ProgressBar:SetLabelVisible
    - input.InputBindingLayer, input.add\_input\_binding\_layer, input.get\_input\_binding\_layers, input.get\_input\_binding\_layer, input.remove\_input\_binding\_layer, input.get\_core\_input\_binding\_layers, input.update\_effective\_input\_bindings, input.get\_effective\_input\_bindings, input.set\_binding\_layer\_enabled, input.is\_binding\_layer\_enabled, input.is\_binding\_layer\_enabled, input.InputBindingLayer:FindBoundKeys
    - locale.localize
    - math.snap\_to\_gridf, math.get\_power\_of\_2\_values, math.calc\_bezier\_point
    - math.Mat4.create\_reflection
    - math.Quaternion:MirrorAxis
    - math.Transform:ToPlane, math.Transform:Reflect
    - math.Vector2:GetAngle, math.Vector:Reflect
    - Model:GetExtensionData, :GetSubMesh, :FindSubMeshId
    - Model.Mesh.Sub:GetTriangle, :GetIndexType, :SetIndexType, :AddIndex, :SetIndex, :GetIndex, :HasUvSet, :GetExtensionData, :ReverseIndices, IndexType and MaxIndex enums
    - Renamed Model.Mesh.Sub:GetTriangles to :GetIndices
    - panima.Animation.load, :RemoveChannel
    - panima.Channel:Resize, :GetSize, :SetTime, :SetValue, :ClearValueExpression, :GetValueExpression, :RemoveValue, :FindInterpolationIndices, :FindIndex, :RemoveValueRange, :AddValueRange, :SortValues, :GetInterpolatedValue, :FindIndexRangeInTimeRange
    - prosper.blur\_texture
    - prosper.RenderTarget:GetColorAttachmentTexture, :GetDepthStencilAttachmentTexture
    - prosper.Window:GetMonitorBounds, :Maximize, :IsMaximized
    - shader.BaseTexturedLit3D:IsDepthPrepassEnabled, :SetDepthPrepassEnabled
    - table.is\_empty, table.table\_to\_map
    - util.File:GetSize, util.import\_assets, util.generate\_hair\_file, util.generate\_hair\_data
    - udm.is\_numeric\_type, is\_generic\_type, is\_non\_trivial\_type, type\_to\_string, get\_numeric\_component, lerp, get\_numeric\_component\_count, is\_vector\_type, is\_matrix\_type, get\_matrix\_row\_count, get\_matrix\_column\_count, is\_array\_type, get\_class\_type, parse
    - input.is\_ctrl\_key\_down, is\_alt\_key\_down, is\_shift\_key\_down
    - udm.Array:ToTable, udm.PropertyWrapper:ToTable, :ToAscii
    - udm.Property:AddValueRange, :RemoveValueRange, :SetValueType, :RemoveValue, :Copy
    - Material:SetLoaded
- Added classes/enums: 
    - util.ThreadPool
    - util.ZipFile
    - gui.DrawToTextureInfo
    - asset.AssetLoadFlags
    - shader.BindState
- Fixed EntityComponent:GetMemberValue, :SetMemberValue not working correctly for some member types
- Fixed util.remove not removing all objects in table correctly in some cases
- Fixed Lua-defined component members of type string not working correctly

### Version 1.0.2 \[2021-09-13\]

##### Filmmaker v0.4.3

- Added options for animating actor properties
- `util_export_asset` command can now export retargeted models
- Fixed depth buffer issues if camera nearZ or farZ is set to 0
- Fixed some meshes not being rendered when rendering with Cycles/LuxCoreRender

**LuxCoreRender**

- Added volumetric lighting options
- Added subdivision options for materials
- Added option for enabling [PhotonGI cache](https://wiki.luxcorerender.org/PhotonGI)

##### Engine

- Added new animation system  
    
    - Added animation math expression system
    - Added animation driver system
- Added entity component member system
- Fixed translucent objects causing depth rendering issues
- Fixed eyes\_updown / eyes\_rightleft flex controllers not working correctly
- Fixed crash instance when trying to import some Source Engine materials with invalid texture references
- Fixed crash instance when importing some Source Engine maps
- Fixed issue where some meshes would appear invisible if the actor has a skin &gt; 0
- Fixed textures with format ABGR8888 getting imported with swapped color channels

##### Lua

- Added new [Lua API documentation](https://wiki.pragma-engine.com/api/docs)
- Added **CompositeComponent:GetEntities, :GetRootGroup, :AddChildGroup, :GetChildGroups**
- Added **panima** library
- Added **ents.EntityComponent:GetMemberIndex**, **:GetMemberInfo**
- Added **util.get\_object\_hash**
- Added **ents.UniversalEntityReference**, **ents.UniversalComponentReference** and **ents.UniversalMemberReference**
- Added **ents.AnimatedComponent.parse\_component\_channel\_path**, **:ClearPreviousAnimation**, **:ReloadAnimation**, **:AdvanceAnimations**
- Added **ents.EntityComponent:GetMemberInfos**
- Added **udm.Array:GetArrayType**, **udm.Element:GetArrayValues**, **:SetArrayValues**, **udm.to\_json**
- Added type aliases: 
    - Entity components can be used in place of entity arguments on C++ function calls
    - EulerAngles and Quaternions can be used interchangeably
    - Vector types can be used interchangeably where applicable

### Version 1.0.1 \[2021-06-22\]

##### Filmmaker v0.4.2

- Improve retargeting performance
- Fix various retargeting issues
- General retargeting improvements
- Update default material hair settings

##### Engine

- Added updated Lua documentation and ZeroBrane configuration files
- Updated "lua\_help" documentation database
- Added "TF2" and "HL1" demo gamemodes
- Fixed random crashes on some hardware
- Fixed issue where game could freeze permanently during shutdown
- Fixed Lua JIT-Compiler not being enabled
- Fixed importing glTF models saving material files in wrong location
- Fixed exporting maps not working in some cases when the map name has a "." in the name
- Fixed crash on startup with certain launch parameters
- Fixed automatic asset reloading on asset file change not working
- Fixed issue where Steam locations wouldn't get mounted properly on new Steam installations
- Added additional crash dump debug information
- Transitioned AI-nav file-format to UDM system
- Transitioned Lua documentation file-format to UDM system

##### Lua

- Added **Skeleton:IsRootBone** string parameter overload
- Added **Skeleton:GetBoneHierarchy**
- Added **phys.Transform.IDENTITY**, **:GetAngles**, **:SetAngles**, **:GetForward**, **:GetRight**, **:GetUp**, **.x**, **.y**, **.z**, **.pitch**, **.yaw**, **.roll**, **phys.ScaledTransform.IDENTITY**
- Added **CompositeComponent:ClearEntities**
- Add **EVENT\_UPDATE\_BONE\_POSES** and **EVENT\_ON\_BONE\_POSES\_FINALIZED** animated component events
- Added **table.copy**
- Added **engine.library\_exists**
- Added **ents.PlayerComponent:SetFlashlightEnabled**, **:ToggleFlashlight**, **:IsFlashlightEnabled**
- General LuaDoc improvements

### Version 0.9.15 \[2021-05-30\]

##### Filmmaker v0.4.1

- Added console commands: **pfm\_max\_fps**, **pfm\_asset\_icon\_size**
- Added bone visualization to retarget editor
- Retarget rigs can now be auto-generated from existing rigs if a match can be found
- Various retargeting improvements
- Fixed "hair" settings in material editor not working
- Fixed PFM not showing up in new game menu
- Fixed material editor and explorer not working properly

##### Engine

- Added console commands: **udm\_validate**, **asset\_clear\_unused**, **asset\_clear\_unused\_textures**, **asset\_clear\_unused\_models**, **asset\_clear\_unused\_materials**, **cache\_version\_target**, **loc\_reload**
- Added launch option: **-audio\_api &lt;audioApi&gt;**
- Added game mount priority options
- Physics engine can now be toggled between **PhysX** and **Bullet**
- **Bullet** is now the default physics engine
- Audio engine is now implemented as a module (can be changed in options)
- Assets are now automatically cleared from memory when not in use
- Transition particle system format to UDM
- Fixed entities appearing invisible in some cases
- Fixed various character animation issues
- Fixed character eyes not working correctly if entity is scaled
- Fixed issue where models with a "." in the name could not get imported properly
- Fixed maps not being rendered if map was compiled without BSP
- Fixed crash when generating reflection probes
- Fixed crash when loading map with invalid world model
- Fixed various crash instances
- Fixed various shader/rendering issues

##### Lua

- Added **debug.beep** and **debug.print**
- Added **phys.CollisionObject:SetAlwaysAwake**, **:IsAlwaysAwake**
- Added **math.map\_value\_to\_fraction** and **math.map\_value\_to\_range**
- Added **locale.set\_text**
- Added **composite** and **animated2** entity components
- Added **util.DirectoryChangeListener** class
- Added **animation.Channel**, **.Slice**, **.Animation2**, **.Pose**, **.Player** classes
- Added **ents.Entity:SetUuid**
- Added **ents.RenderComponent:GetRenderModeProperty**
- Added **ents.EyeComponent:GetEyePose**
- Added **udm.PropertyWrapper:GetChildCount**, :**HasValue** and :**ToAscii**
- Added **ents.AnimatedComponent:GetLayeredAnimations**, **:ApplyLayeredAnimations**
- Added **game.Model.Animation:GetBoneId**
- Added **ents.IteratorFilterModel**
- Added **asset.delete**, **.determine\_type\_from\_extension**, **.get\_legacy\_extension, .get\_binary\_udm\_extension, .get\_ascii\_udm\_extension, .determine\_format\_from\_data, .determine\_format\_from\_filename, .matches, .relative\_path\_to\_absolute\_path, .absolute\_path\_to\_relative\_path, .get\_udm\_format\_extension, .get\_asset\_root\_directory, .exists, .find\_file, .is\_loaded**
- Added **file.find\_absolute\_path**
- Added new overload for **file.remove\_file\_extension** with parameter to specify which extensions to remove
- Added **udm.AssetData:SetData**
- Added **gui.find\_focused\_window**, **gui.get\_primary\_window**, **gui.find\_window\_under\_cursor**, **gui.get\_base\_elements**, **gui.add\_base\_element**
- Added **gui.Element:GetRootElement**, **:GetRootWindow**
- Added **shader.BasePbr** base class
- Added **prosper.create\_window**, **prosper.WindowCreateInfo** and **prosper.Window** classes
- Fixed **ents.Entity:SetEnabled** Lua binding not behaving correctly in certain cases
- Scripts loaded with **lua\_exec** and **lua\_exec\_cl** now auto reload when changed (Unless"nocache" argument is set)
- **util.register\_class** now defines a default constructor and tostring method
- **util.register\_class** now returns class object (or nil) instead of boolean

### Version 0.9.14 \[21-04-16\]

##### Filmmaker

- Added animation and flex retargeting system
- Transform widget can now be toggled between world/local/view space
- Added basic posing and animating capabilities
- Improved hair rendering quality with LuxCoreRender
- Added hair configuration options to material editor
- Added live raytracing preview

##### Engine

- Added "util\_export\_asset" option to export assets to Source Engine model/material/texture format with optional fake pbr conversion
- Transitioned asset file formats to UDM system
- Added console commands: "udm\_convert", "save", "crash", "debug\_render\_memory\_budget" and "debug\_render\_memory\_stats"
- Exporting model with glTF exporter now includes additional UV sets (such as lightmap UVs)
- Fixed rare random deadlock issue
- Added entity UUIDs to uniquely identify entities
- Added additional crash dump debug information

##### Lua

- Added **asset.get\_supported\_extensions, asset.export\_texture\_as\_vtf, asset.TYPE\_MAP**
- Added **ents.GetUuid, ents.AttachableComponent:GetBone**
- Added **Quaternion:Distance**
- Added class **ents.IteratorFilterUuid**
- Added **udm** library
- Added **game.get\_material**
- Added **util.BSPTree.Node:GetIndex**
- Added **game.Material:Reset**
- Added **game.Model.Animation.Load**, **game.Model.FlexAnimation.Load**
- Added **game.Model.Mesh.Sub:Copy**
- Added **game.Model.Animation:GetBoneId**
- Added **game.Model.Eyeball:GetUpperLidFlexIndices**, **:GetUpperLidFlexAngles**, **:GetLowerLidFlexIndices**, **:GetLowerLidFlexAngles**, **:GetUpperLidFlexIndex** and **:GetLowerLidFlexIndex**
- Added **game.Model.FCOPY\_BIT\_FLEX\_ANIMATIONS** flag
- Added **ents.ModelComponent:GetBodyGroups**, **:SetBodyGroups**
- Added **ents.AnimatedComponent:GetBaseAnimationFlags**, **:SetBaseAnimationFlags**, **:GetLayeredAnimationFlags**, **:SetLayeredAnimationFlags, ents.AnimatedComponent:SetAnimatedRootPoseTransformEnabled,** **:IsAnimatedRootPoseTransformEnabled, :AddRootPoseBone**, **:SetRootPoseBoneId**, **:GetRootPoseBoneId** and **ents.AnimatedComponent.FPLAYANIM\_LOOP**
- Added **ents.LightComponent:SetMorphTargetsInShadowsEnabled**, **:AreMorphTargetsInShadowsEnabled, .BakeSettings.globalLightIntensityFactor** and **.import\_lightmap\_atlas**
- Added **ents.ReflectionProbeComponent:GetIBLMaterialFilePath**, **:CaptureIBLReflectionsFromScene** and **:RequiresRebuild**
- Added **prosper.ImageCreateInfo:FLAG\_ALLOCATE\_DISCRETE\_MEMORY\_BIT**, **FLAG\_DONT\_ALLOCATE\_MEMORY\_BIT**, **FLAG\_SRGB\_BIT**, **FLAG\_NORMAL\_MAP\_BIT**
- Added **prosper.Image:IsSrgb**, **:IsNormalMap**, **:SetSrgb**, **:SetNormalMap** and **:Convert**
- Added **prosper.Mesh:ClearBuffers**
- Added **ents.LightMapComponent:SetLightmapAtlas**
- Added **ents.RenderComponent:ClearBuffers**
- Removed **game.Model.Eyeball:GetUpperFlexDesc**, **:GetLowerFlexDesc**, **:GetUpperTarget**, **:GetLowerTarget**, **.lowerLidFlexDesc** and **.upperLidFlexDesc**

### Version 0.9.13 \[2021-03-14\]

##### Filmmaker

- Fully integrated LuxCoreRender
- Added support for transparent backgrounds/skies when rendering with LuxCoreRender
- Added new render tool commands (LuxCoreRender only): 
    - preview: Creates a preview image of what's been rendered so far and opens it in the default image program
    - pause: Pauses the current render
    - resume: Resumes the current render
    - stop: Stops the render and uses what's been rendered so far to generate the final image
    - suspend: Creates a .rsm-file, which can be used to continue the render at a later date
    - export: Exports the entire scene in a LuxCoreRender format (including models and textures), which can be used to render it with the [standalone LuxCoreRender program](https://luxcorerender.org/download/)
- Fixed issue where importing textures via drag-and-drop would not generate mipmaps

##### Engine

- Updated [build instructions](https://github.com/Silverlan/pragma)
- Morph targets now affect shadows
- Increased bone limit from 512 to 1024
- Added console commands "strip\_weapons" and "cl\_render\_frustum\_culling\_enabled"
- Reduced number of entities with unnecessary tick/logic events to improve performance
- Characters now blink if no eyeballs are defined in the model, but blink flex controllers exist
- Added [UDM](https://github.com/Silverlan/util_udm) data format for unifying asset file formats
- Fixed issue where viewmodel entities would use incorrect field of view
- Fixed viewmodel not appearing in some cases if viewmodel was changed after weapon was deployed
- Changed entity component net event system so net events no longer have to be registered on the server *before* they are registered on the client
- Merged cengine with client library and engine with shared

##### Lua

- Removed gamemode system and replaced it with gamemode entity components 
    - Allows changing gamemodes on the fly, as well as running multiple different gamemodes at the same time
- Added "player" and "gamemode" entity component types (and sub-directories)
- All entity components can now have individual tick/logic events instead of relying on the logic component
- Added **udm** library for loading/saving/working with udm assets
- Added **ents.ModelComponent:GetBodyGroups** and **:SetBodyGroups**
- Added **math.Quaternion:Distance**
- Added **ents.PhysicsComponent:EnableCollisions**, **:DisableCollisions**, **:SetCollisionsEnabled**, **:SetSimulationEnabled** and **:IsSimulationEnabled**
- Added **ents.CharacterComponent:SetMoveController** and **:GetMoveController**
- Added **util.DataStream:WriteVertex**, **:ReadVertex**
- Added **Vector:GetYaw** and **:GetPitch**
- Added **util.generate\_uuid\_v4**
- Added **ents.register\_component\_net\_event**
- Added **ents.AttachableComponent.FATTACHMENT\_MODE\_FORCE\_TRANSLATION\_IN\_PLACE**, **FATTACHMENT\_MODE\_FORCE\_ROTATION\_IN\_PLACE** and **FATTACHMENT\_MODE\_FORCE\_IN\_PLACE**

### Version 0.9.12 \[2021-02-08\]

##### Filmmaker

- Added support for rendering with [**LuxCoreRender**](https://luxcorerender.org/gallery/)
- Added fur rendering options with LuxCoreRender

##### Engine

- Massive general performance improvements
- Added automatic rendering instancing system
- Added flex animation system
- Added new bloom/glow implementation
- Added lightmap baking with Cycles
- Added console commands **debug\_render\_octree\_dynamic\_find**, **debug\_render\_stats**, **render\_vsync\_enabled**, **render\_draw\_static**, **render\_draw\_dynamic**, **render\_translucent**, **cl\_render\_shadow\_lod\_bias**, **render\_queue\_worker\_thread\_count**, **debug\_textures**, **sky\_override**, **render\_queue\_entities\_per\_worker\_job**, **render\_queue\_worker\_jobs\_per\_batch**, **render\_instancing\_threshold** and **render\_instancing\_enabled**
- Fixed issue where camera would move upwards continuously in fullscreen windowed resolution mode
- Fixed first LOD being skipped when importing Source Engine models
- Fixed model LODs not working
- Fixed various crash bugs
- Fixed bone scaling not working correctly in some cases

##### Lua

- Added **ents.RenderComponent:GetLocalRenderBounds**, **ents.RenderComponent:GetLocalRenderSphereBounds**, **ents.RenderComponent:GetAbsoluteRenderBounds**, **ents.RenderComponent:GetAbsoluteRenderSphereBounds**, **ents.RenderComponent:SetLocalRenderBounds**, **ents.RenderComponent:ShouldCastShadows**, **ents.RenderComponent:ShouldDraw**, **ents.RenderComponent:ShouldDrawShadow**, **ents.RenderComponent.EVENT\_ON\_RENDER\_MODE\_CHANGED** and **ents.RenderComponent.EVENT\_UPDATE\_INSTANTIABILITY**
- Added **util.DataBlock:GetVector2**
- Added **game.Material.detail\_blend\_mode\_to\_enum** and **game.Material.DetailBlendMode** enums
- Added **ents.SceneComponent:GetRenderQueue**, **ents.SceneComponent:BuildRenderQueue** and **ents.SceneComponent.CreateInfo**
- Added **math.Vector:ToScreenUv**
- Added **game.set\_default\_game\_render\_enabled**, **game.is\_default\_game\_render\_enabled**, **game.render\_scenes**, **game.set\_debug\_render\_filter** and **game.update\_render\_buffers**
- Added **game.RENDER\_FLAG\_TRANSLUCENT\_BIT**
- Added **util.ImageBuffer:SwapChannels**
- Added **prosper.get\_api\_identifier**, **prosper.get\_api\_abbreviation**, **prosper.wait\_for\_current\_swapchain\_command\_buffer\_completion**, **prosper.create\_primary\_command\_buffer** and **prosper.create\_secondary\_command\_buffer**
- Added **prosper.CommandBuffer:Flush**
- Added **game.DrawSceneInfo.FLAG\_FLIP\_VERTICALLY\_BIT**, **game.DrawSceneInfo.FLAG\_DISABLE\_RENDER\_BIT** and **game.DrawSceneInfo.flags**
- Added classes **game.RenderQueue**, **game.DepthStageRenderProcessor**, **game.LightingStageRenderProcessor**, **shader.GameWorld**, **game.Model.FlexAnimation** and **game.Model.FlexAnimation.Frame**
- Added **ents.ModelComponent:SetMaxDrawDistance**, **ents.ModelComponent:GetMaxDrawDistance** and **ents.ModelComponent.EVENT\_ON\_RENDER\_MESHES\_UPDATED**
- Added **ents.AnimatedComponent:AreSkeletonUpdateCallbacksEnabled**, **ents.AnimatedComponent:SetSkeletonUpdateCallbacksEnabled**, **ents.AnimatedComponent.EVENT\_ON\_SKELETON\_UPDATED**, **ents.AnimatedComponent.EVENT\_ON\_BONE\_MATRICES\_UPDATED** and **ents.AnimatedComponent.EVENT\_ON\_BONE\_BUFFER\_INITIALIZED**
- Added **util.BSPTree:FindLeafNodesInAABB**
- Added **ents.LightmapComponent.bake\_lightmaps**, **ents.LightmapComponent:SetExposure**, **ents.LightmapComponent:GetExposure**, **ents.LightmapComponent:GetExposureProperty** and **ents.LightmapComponent.BakeSettings**
- Added **ents.FlexComponent:PlayFlexAnimation**, **ents.FlexComponent:StopFlexAnimation**, **ents.FlexComponent:GetFlexAnimationCycle**, **ents.FlexComponent:SetFlexAnimationCycle** and **ents.FlexComponent:SetFlexAnimationPlaybackRate**
- Added **game.Model:GetFlexAnimations**, **game.Model:GetFlexAnimationNames**, **game.Model:GetFlexAnimationCount**, **game.Model:AddFlexAnimation**, **game.Model:LookupFlexAnimation**, **game.Model:GetFlexAnimation**, **game.Model:GetFlexAnimationName**, **game.Model:ClearFlexAnimations**, **game.Model:RemoveFlexAnimation**, **game.Model.AddFlexControllerId**, **game.Model.SetFlexControllerValue**, **game.Model.LookupLocalFlexControllerIndex**, **game.Model:GetLOD** and **game.Model.Mesh:RemoveSubMesh**
- Added **game.RasterizationRenderer:ReloadPresentationRenderTarget**
- Added **file.to\_relative\_path**
- Added **geometry.calc\_point\_on\_triangle** and **geometry.calc\_triangle\_area**
- **util.save\_image** now has an option for saving cubemap textures
- Removed **ents.SceneComponent:PrepareRender**, **ents.TransformComponent:GetPosProperty**, **ents.TransformComponent:GetRotationProperty**, **ents.TransformComponent:GetScaleProperty**, **game.draw\_scene**, **ents.RenderComponent:GetRenderBounds**, **ents.RenderComponent:SetRenderBounds**, **ents.RenderComponent:GetRenderSphereBounds**, **ents.RenderComponent:GetRenderModeProperty**, **ents.RenderComponent:SetDepthBias,** **ents.RenderComponent:GetDepthBias**, **game.DrawSceneInfo.flipVertically** and **ents.RenderComponent.RENDERMODE\_AUTO**
- Changed parameters of **ents.SceneComponent:Render** and **ents.RenderComponent:UpdateRenderBuffers**

### Version 0.9.11 \[2020-11-11\]

##### Filmmaker

- Cycles render settings are now saved with the project
- Changed frame render order when rendering animations with external render tool for easier quality control
- Added support for detail maps when rendering with Cycles
- Fixed emission textures having no effect when rendering with Cycles
- Fixed IOR value being set improperly when opening material in material editor
- Fixed material editor not updating properly when switching to a different material
- Fixed HDR output format not working properly when rendering with Cycles
- Changed default gamma correction value when rendering with Cycles to 2.2 (was 2.4 before)

##### Engine

- Added support for **$detail**, **$detailscale**, **$detailblendfactor**, **$detailblendmode** and **$detailtint** VMT parameters
- Added CS: GO to default game mount list
- Fixed issue where entities with morph target animations would get visually corrupted if they were made invisible and then visible again
- Fixed issue where ingame cursor position would mismatch actual cursor position in fullscreen windowed resolution mode
- Fixed issue where camera would move upwards continuously in fullscreen windowed resolution mode

##### Lua

- Replaced class **game.Scene** with **ents.SceneComponent**
- Added **ents.SceneComponent.OcclusionCullingMethod** enums
- Added **game.Material.DetailBlendMode** enums
- Added **game.Material.detail\_blend\_mode\_to\_enum**
- Added **ents.SceneComponent:SetOcclusionCullingMethod**
- Added **game.Model:GetBodyGroupMesh**
- Added **game.Material:SetShader**
- Added **ents.Entity:GetBodyGroup** and **:SetBodyGroup** overloads for body group IDs
- Added **ents.BaseEntityComponent:Save**, **ents.BaseEntityComponent:Load** and **ents.BaseEntityComponent:Copy**
- Added **ents.Entity:RemoveFromAllScenes** and **ents.Entity:AddChild**
- Added **debug.breakpoint** (Only available if `-luaext` was specified in the launch options)
- Added **math.Mat4:ApplyProjectionDepthBiasOffset**
- Added **ents.RenderComponent:SetReceiveShadows** and **ents.RenderComponent:IsReceivingShadows**
- Added **ents.EyeComponent:ClearViewTarget**
- Added **util.DataBlock:GetVector2**
- Renamed **game.create\_scene** to **ents.create\_scene**
- **util.remove** now has a second argument for removing objects safely (if available)
- **toboolean** and **toint** now accept numbers and booleans as arguments
- Changed parameter order of **ents.create\_prop**

### Version 0.9.10

##### Filmmaker

- Added Cycles option for setting the number of frames to the end of a clip or session
- Render jobs now take up a lot less disk space for animations (static geometry is now stored shared instead of every frame)
- Slightly improved overall rendering speed
- Fixed rendering taking up your entire CPU resources when rendering with your GPU
- Fixed an issue where rendering several times consecutively could slow your PC down to a crawl
- Fixed VR renders being flipped horizontally
- Fixed a denoising issue which caused less than optimal denoising quality
- Fixed issue where the tiles in the final image would have mismatching sample counts and some tiles would be lower quality as a result
- Fixed render preview not being interactable when rendering VR images
- Fixed potential crash when doing a preview render with the Vulkan renderer being used

##### Engine

- Minor occlusion culling performance optimizations
- Greatly improved reflection probe rendering speed
- Fixed issue where entities would get rendered with error materials if their skin would exceed the max skin count of their model
- Fixed bone scaling not working correctly
- Fixed massive performance hit for light sources that cast shadows in the past, but had shadow casting disabled
- Fixed BSP occlusion culling not working for imported Source Engine maps
- Fixed meshes not being rendered if entity skin exceeds maximum skin count
- Improved lightmap implementation
- Various minor bug fixes and improvements
- Improved loading times when starting a game

##### Lua

- Added class **util.Version**
- Added **exec**
- Added **ents.create\_prop**
- Added **ents.AnimatedComponent:SetBindPose** and **ents.AnimatedComponent:GetBindPose**
- Added **ents.LightMapComponent:UpdateLightmapUvBuffers**, **ents.LightMapComponent:ReloadLightmapData** and **ents.LightMapComponent:SetLightmapAtlas**
- Added **ents.LightMapReceiverComponent:UpdateLightmapUvData**
- Added **gui.Element:InjectMouseClick** and **gui.Element:InjectKeyPress**
- Added **ents.Entity:IsDisabled** and **ents.Entity:IsTurnedOff**
- Added **util.Path:CreateFilePath** and **util.Path:CreatePath**
- Added **ents.MapComponent:GetMapIndex**
- Added **ents.AnimatedComponent:PlayAnimation** overloads for playing animations by id
- Added **util.DataBlock:ToString**
- Added **game.Model.Frame:Copy**, **game.Model.Skeleton.Bone:IsAncestorOf** and **game.Model.Skeleton.Bone:IsDescendantOf**
- Added **math.calc\_average\_rotation**
- Added **file.strip\_illegal\_filename\_characters**
- Added **game.Model.Mesh:GetReferenceId**
- Added **game.Model.Mesh.Sub:FlipTriangleWindingOrder**, **:SetVertexCount**, **:SetIndexCount**, **:AddUVSet,** **:GetUVSetNames**, **:SetVertexTangent** and **:HasUVSet**
- Added **string.hash**
- Added new overload for **game.Model.Mesh.Sub:GetUVs**, **:SetVertexUV**, **:GetVertexUV** with UV set parameter
- Changed argument format for **util.pack\_zip\_archive**
- Renamed **ents.AnimatedComponent:GetBindPose** to **ents.AnimatedComponent:GetBoneBindPose**
- **util.remove** now accepts a table as argument
- **file.write** now automatically creates the file path if it doesn't exist
- File write operations now accept paths that include "addons/&lt;addonName&gt;/" as prefix

# Troubleshooting

### Pragma crashes on startup

If Pragma crashes on startup, please ensure that your system fulfills the [system requirements](https://wiki.pragma-engine.com/books/pragma-engine/page/download#bkmrk-%5Bwip%5D) and that your graphics drivers are up to date.

If you have multiple GPUs, please make sure to enable your high-default GPU as the default for Pragma. You can follow the instructions [on this page](https://pureinfotech.com/set-gpu-app-windows-10/) to do so.

### There is no text in the main menu

Try adding `-graphics_api vulkan` to the launch options in Pragma to switch to the Vulkan renderer:

[![firefox_2020-08-21_09-35-29.png](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/scaled-1680-/firefox_2020-08-21_09-35-29.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2020-08/firefox_2020-08-21_09-35-29.png)

### I have an AMD GPU and Pragma/PFM crashes on startup

This should be fixed in newer versions of PFM, until they are released publicly, you can try this temporary fix:

1. Go to the Pragma root folder
2. Remove the `cache` directory
3. Go to `Pragma/shaders/world/eye/`
4. Rename `fs\_eye.gls` to `fs\_eye\_bak.gls`
5. Launch PFM

Character eyes won't be rendered properly in the real-time render viewport, but it shouldn't be freezing anymore.

# Mapping



# Asset Import / Export

### Export

Pragma comes with the following export capabilities:

- You can use Pragma to export Source Engine and Source 2 Engine assets for use in modelling programs
- Assets in Pragma can be exported in the Source Engine model/material/texture format 
    - Fake PBR can be applied automatically for use in SFM
- Automatic generation of ambient occlusion maps (if they don't exist)
- Automatic re-scaling of the models to meters
- Conversion to match Blender's coordinate system
- Includes the rig, all of the animations and morph targets of the model
- Conversion to standard normal maps (e.g. if self-shadowed bumpmaps are used)
- Conversion of Source 1 assets with PBR settings
- Automatic conversion of the textures to png, bmp, tga, jpg, hdr, dds, ktx or vtf
- Automatic conversion of the textures to a RMA format
- Works with maps / level geometry

#### Exporting Assets

If you want to export a model or material, the easiest way to do so is via the Filmmaker interface. Simply open the model/material catalog, right click on the model icon, then click "Export asset":

[![export_model_asset.png](https://wiki.pragma-engine.com/uploads/images/gallery/2021-04/scaled-1680-/pragma_2021-04-07_18-38-05.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2021-04/pragma_2021-04-07_18-38-05.png)

If you want to export a different asset type, or need more control, you can use the export command utility instead. To use it, start a game in Pragma first. You can either load a map (which map doesn't matter), or run "map empty" in the console. Once the map has been loaded, you can use the "util\_export\_asset" console command with the following parameters:

- **-model** *&lt;modelName&gt;*: Exports the specified model. If a directory is specified, all models within that directory will be exported.
- **-texture** *&lt;textureName&gt;*: Exports the specified texture(s). If a directory is specified, all textures within that directory will be exported.
- **-material** *&lt;materialName&gt;*: Exports the specified material(s). If a directory is specified, all materials within that directory will be exported.
- **-map** *&lt;mapName&gt;*: Exports the specified map(s). If a directory is specified, all maps within that directory will be exported.
- **-export\_images** *1/0*: If enabled, all textures of the asset will be converted to the specified image output format and saved alongside the asset. Default: 1
- **-normalize\_texture\_names** *1/0*: If enabled, the exported textures will be renamed according to their type (e.g. "textureName\_normal") and will not keep their original name. Default: 0
- **-image\_format** *png/bmp/tga/jpg/hdr/dds/ktx*: The format to use for exported textures. Default: dds
- **-binary** *1/0*: If enabled, the model will be exported in the "glb" format, otherwise "glTF". Default: 0
- **-verbose** *1/0*: If enabled, additional information will be printed to the console during the export. Default: 1
- **-recursive** *1/0*: If enabled and a directory is specified as the asset, all assets from all sub-directories will be exported as well. Default: 0

Models only:

- **-export\_animations** *1/0*: If enabled, all animations of the model will be exported as well. This may drastically increase the file size and loading times when importing the model into a modelling program. Default: 1
- **-export\_morph\_targets** *1/0*: If enabled, will export all morph targets (flexes) of the model as well. Default: 1
- **-export\_skinned\_mesh\_data** *1/0*: If disabled, no skeleton, vertex weights or animations will be exported. Default: 1
- **-embed\_animations** *1/0*: If enabled, all of the animations of the model will be embedded in the exported glTF file. When disabled, each animation will be exported as a separate file instead. Default: 1
- **-full\_export** *1/0*: If enabled, body groups of the model will be exported as well. Default: 0
- **-scale** *&lt;scale&gt;*: The value by which to scale the exported meshes. Use 1 to keep the original scale. Use 0.025 to convert the meshes to meters. Default: 0.025
- **-generate\_ao** *1/0*: If enabled, will automatically generate ambient occlusion maps for the model if it doesn't have any. Default: 0
- **-ao\_resolution** *&lt;resolution&gt;*: The resolution to use for the ambient occlusion maps if "generate\_ao" is enabled. Default: 512
- **-ao\_samples** *&lt;samples&gt;*: The number of samples to use for generating the ambient occlusion maps if "generate\_ao" is enabled. Default: 40
- -**ao\_device** *cpu/gpu*: Whether to use the CPU or GPU to generate the ambient occlusion maps if "generate\_ao" is enabled. Default: cpu
- **-merge\_meshes\_by\_material** *1/0*: If enabled, all meshes that use the same material will be merged. Default: 1
- **-enable\_extended\_dds** *1/0*: If enabled and the image format is set to dds, will enable support for BC6 and BC7 compression using the DXT10 version of the format. Default: 0
- **-list\_animations** *1/0*: If enabled, the model will not be exported and all available animations of the model will be listed in the console instead. Default: 0
- **-animation** *&lt;animName&gt;*: If specified, only this animation will be exported.
- **-format** *glTF/mdl*: The output format for the model. If "mdl" is specified TODO
- **-game** *1/0*: Only has an effect if "format" is set to "mdl". TODO
- **-preview** *1/0*: If enabled, the model will be shown in the viewport. Default: 0

<p class="callout info">If you want to use Pragma to export Source Engine assets, you generally don't have to copy any of the assets to Pragma, the Engine should be able to locate the assets automatically as long as they're part of one of your installed Source Engine games on Steam.</p>

##### Usage Examples

Exporting a material (including textures):

```shell
util_export_asset -material "brick/brick_1a" -verbose -image_format png
```

Exporting a texture:

```shell
util_export_asset -texture "concrete/concrete_5_floor_3_psd_918fcd2d" -verbose -image_format png
```

Exporting a map:

```shell
util_export_asset -map "gm_construct" -verbose -export_images 1 -image_format png -generate_ao 0 -export_animations 0
```

Exporting a model:

```shell
util_export_asset -model "props_2fort/tank001" -verbose -image_format png -generate_ao 0
```

(Make sure to remove the ".mdl" extension!)

Exporting a Source 2 model:

```shell
util_export_asset -model "characters/gman/gman" -verbose -image_format png -generate_ao 0
```

Batch-exporting all models in a directory and all sub-directories:

```shell
util_export_asset -model "props_2fort" -verbose -image_format png -generate_ao 0 -recursive 1
```

##### Exporting retargeted models

<p class="callout info">This section refers to PFM v0.4.3 and newer and may not be representative of older versions.</p>

It is also possible to export a model with retargeted animations (i.e. export a model with the animations of another model.):

[![2021-09-24_21-16-05.gif](https://wiki.pragma-engine.com/uploads/images/gallery/2021-09/2021-09-24-21-16-05.gif)](https://wiki.pragma-engine.com/uploads/images/gallery/2021-09/2021-09-24-21-16-05.gif)

To do so, you will have to set up a retarget rig in PFM's retarget editor first:

<iframe allowfullscreen="allowfullscreen" height="314" src="https://www.youtube-nocookie.com/embed/2f-pxcjbanA" width="560"></iframe>

Once you have created the retarget rig, you can use the `-retarget_source` argument in the `util_export_asset` command to export the model with the retargeted animations:

```shell
util_export_asset -model "e3assassin" -retarget_source "re5/jv1" -verbose -image_format tga -generate_ao 0 -embed_animations 1
```

##### Exporting to Source Engine

You can also use the command to export a model **to** the Source Engine .mdl format. To do so, simply set the "format" parameter to "mdl":

```shell
util_export_asset -model "props_2fort/tank001" -format "mdl"
```

<p class="callout info">Most of the parameters listed above will have no effect when using the Source Engine mdl-exporter!</p>

This will automatically generate the QC and SMD files for the model, convert the textures to vtf, convert the materials to vmt, as well as automatically compile the model using studiomdl. Pragma will attempt to locate studiomdl automatically, but you can also specify which game's studiomdl should be used:

```shell
util_export_asset -model "props_2fort/tank001" -format "mdl" -game "tf2"
```

This will use the studiomdl from TF2. The game name has to match the entry from "Pragma/cfg/mounted\_games.udm" (You can open the file in a text-editor).

If the model's materials use PBR, the exporter will also automatically apply fake PBR for use in SFM.

All of the model's animations will be included in the Source Engine model as well, however morph targets are currently not supported.

##### Using Pragma to convert models from Blender to Source

Converting a model from Blender (or other modelling programs) is very simple. All you have to do is export your model from Blender in either the glTF format, or the glb format and copy the exported file to "Pragma/addons/imported/models". Then use the command above and replace the model name with the name of the glTF/glb file (without the extension).

#### Source 2

The approach for Source 2 assets is exactly the same as for Source 1 assets, with the exception of maps. To export a Source 2 map, follow these steps (using Half-Life: Alyx as an example):

1. Open the map's vpk-file (steamapps/common/Half-Life Alyx/game/hlvr/maps) in [GCFScape](https://developer.valvesoftware.com/wiki/GCFScape)
2. Extract all of the files from the vpk to "Pragma/addons/imported/"
3. Run the "util\_export\_asset" command with the asset name pointing to the "vwrld\_c"-file. For example, for the map "a5\_vault", you should use:

```shell
util_export_asset -map "a5_vault/world" -verbose -export_images 1 -image_format png -generate_ao 0
```

### Import

If you want to import a model from Blender (or other modelling programs), all you have to do is export the model in the glTF or glb format and copy the exported file to "Pragma/addons/imported/models". The model should automatically show up in the PFM model catalog and it will automatically get converted (along with the textures) when used.

##### Source Engine / Source 2

If you want to import a model (or material/texture) from Source or Source 2, you generally don't have to do anything. All of your installed Source Engine games (assuming they're installed via Steam) should be automatically detected and mounted by Pragma. In the rare event that this doesn't work, you can try adding the mount path for the game to "Pragma/cfg/mounted\_games.udm".

Alternatively you can also simply extract the asset files to "Pragma/addons/imported/models" and "Pragma/addons/imported/materials" respectively.

# Console Commands

# Variables

##### audio\_api &lt;audioApi&gt;

**Type:** String

The underlying audio API to use.

##### cache\_version &lt;value&gt;

**Type:** String

The engine version that the cache files are associated with. If this version doesn't match the current engine version, the cache will be cleared.

##### cache\_version\_target &lt;value&gt;

**Type:** String

If cache\_version does not match this value, the cache files will be cleared and it will be set to it.

##### cl\_allowdownload &lt;value&gt;

**Type:** String

##### cl\_allowupload &lt;value&gt;

**Type:** String

##### cl\_audio\_always\_play &lt;value&gt;

**Type:** String

0 = Don't play sounds if window isn't focused., 1 = Always play sounds

##### cl\_audio\_hrtf\_enabled &lt;value&gt;

**Type:** String

Enables or disables Head-related transfer function.

##### cl\_audio\_master\_volume &lt;value&gt;

**Type:** String

Volume scale for all sounds.

##### cl\_audio\_streaming\_enabled &lt;value&gt;

**Type:** String

0 = All sounds will be loaded immediately (= Slower load times), 1 = Some sounds will be loaded over time. (= Sounds might start with a delay)

##### cl\_controller\_axis\_input\_threshold &lt;value&gt;

**Type:** String

Axis inputs below this threshold will be ignored for regular console commands.

##### cl\_controller\_enabled &lt;value&gt;

**Type:** String

Enables or disables game controllers / joysticks.

##### cl\_downscale\_imported\_high\_resolution\_rma\_textures 1/0

**Type:** Boolean

If enabled, imported high-resolution RMA textures will be downscaled to a more memory-friendly size.

##### cl\_effects\_volume &lt;value&gt;

**Type:** String

Volume scale for effect sounds (e.g. footsteps, gunshots, explosions, etc.).

##### cl\_flex\_phoneme\_drag &lt;value&gt;

**Type:** String

Changes the time required for facial phoneme flexes to adapt to new phonemes.

##### cl\_fov &lt;value&gt;

**Type:** String

Horizontal world field of view.

##### cl\_fov\_viewmodel &lt;value&gt;

**Type:** String

Horizontal view model field of view.

##### cl\_fps\_decay\_factor &lt;value&gt;

**Type:** String

How slowly to decay the previous fps.

##### cl\_gpu\_device &lt;value&gt;

**Type:** String

The unique identifier for the GPU vendor and device to use. If empty (or invalid), the first detected device will be used. Usage: &lt;vendorId,deviceId&gt;

##### cl\_gpu\_timer\_queries\_enabled &lt;value&gt;

**Type:** String

Enables or disables GPU timer queries for debugging.

##### cl\_gui\_volume &lt;value&gt;

**Type:** String

Volume scale for sounds emitted by GUI elements.

##### cl\_language &lt;value&gt;

**Type:** String

Game language.

##### cl\_material\_streaming\_enabled &lt;value&gt;

**Type:** String

0 = All materials and textures will be loaded immediately (= Slower load times), 1 = All materials and textures will be loaded over time. (= Black textures until loaded)

##### cl\_max\_fps &lt;value&gt;

**Type:** String

FPS will be clamped at this value. A value of &lt; 0 deactivates the limit.

##### cl\_mouse\_acceleration &lt;value&gt;

**Type:** String

Amount of mouse acceleration. 1 = No acceleration.

##### cl\_mouse\_pitch &lt;value&gt;

**Type:** String

Mouse sensitivity on the pitch axis. Use positive values to invert the axis.

##### cl\_mouse\_sensitivity &lt;value&gt;

**Type:** String

Scale for the mouse sensitivity.

##### cl\_mouse\_yaw &lt;value&gt;

**Type:** String

Mouse sensitivity on the yaw axis.

##### cl\_music\_volume &lt;value&gt;

**Type:** String

Volume scale for music.

##### cl\_physics\_simulation\_enabled &lt;value&gt;

**Type:** String

Enables or disables physics simulation.

##### cl\_port\_tcp &lt;value&gt;

**Type:** String

Port used for TCP transmissions.

##### cl\_port\_udp &lt;value&gt;

**Type:** String

Port used for UDP transmissions.

##### cl\_render\_anti\_aliasing &lt;value&gt;

**Type:** String

0 = No Anti Aliasing, 1 = MSAA, 2 = FXAA.

##### cl\_render\_brightness &lt;value&gt;

**Type:** String

Scene brightness.

##### cl\_render\_contrast &lt;value&gt;

**Type:** String

Scene contrast.

##### cl\_render\_depth\_of\_field &lt;value&gt;

**Type:** String

Depth of field scale.

##### cl\_render\_fov &lt;value&gt;

**Type:** String

Specifies the horizontal field of view.

##### cl\_render\_frustum\_culling\_enabled &lt;value&gt;

**Type:** String

Enables or disables frustum culling.

##### cl\_render\_fxaa\_edge\_threshold &lt;value&gt;

**Type:** String

The minimum amount of local contrast required to apply algorithm.

##### cl\_render\_fxaa\_min\_edge\_threshold &lt;value&gt;

**Type:** String

Trims the algorithm from processing darks.

##### cl\_render\_fxaa\_sub\_pixel\_aliasing\_removal\_amount &lt;value&gt;

**Type:** String

The amount of sub-pixel aliasing removal.

##### cl\_render\_lod\_bias &lt;value&gt;

**Type:** String

Model LOD-bias. Higher values means higher LOD-Models will be used at lower distance (=Lower quality).

##### cl\_render\_monitor &lt;value&gt;

**Type:** String

Which monitor to use in fullscreen mode.

##### cl\_render\_motion\_blur &lt;value&gt;

**Type:** String

Amount of motion blur. 0 = disabled.

##### cl\_render\_msaa\_samples &lt;value&gt;

**Type:** String

1 = MSAAx2, 2 = MSAAx4, 3 = MSAAx8, etc.

##### cl\_render\_occlusion\_culling &lt;value&gt;

**Type:** String

0 = Off, 1 = Brute-Force, 2 = CHC++, 3 = Octree, 4 = BSP +Octree

##### cl\_render\_particle\_quality &lt;value&gt;

**Type:** String

Quality of particle systems. 0 = No particles will be rendered, 1 = Particles will be unlit, 2 = Particles will receive lighting, 3 = Particles will cast shadows.

##### cl\_render\_present\_mode &lt;value&gt;

**Type:** String

0 = Immediate, 1 = FIFO, 2 = Mailbox

##### cl\_render\_preset &lt;value&gt;

**Type:** String

Selected preset in display options.

##### cl\_render\_reflection\_quality &lt;value&gt;

**Type:** String

Changes the quality of reflections. 0 = Only static reflections, 1 = Dynamic reflections, 2 = Reflections with particle effects.

##### cl\_render\_resolution &lt;value&gt;

**Type:** String

Changes the internal rendering resolution. If left empty, the resolution will be the same as the window resolution!

##### cl\_render\_shader\_quality &lt;value&gt;

**Type:** String

Shader quality. The actual effect depends on the shader. 1 = Lowest Quality, 10 = Highest Quality

##### cl\_render\_shadow\_dynamic &lt;value&gt;

**Type:** String

Turns dynamic shadows on or off.

##### cl\_render\_shadow\_lod\_bias &lt;value&gt;

**Type:** String

Model LOD-bias for shadows. Higher values means higher LOD-Models will be used at lower distance (=Lower quality). This value is added on top of cl\_render\_lod\_bias!

##### cl\_render\_shadow\_pssm\_split\_count &lt;value&gt;

**Type:** String

The number of cascades to be used for PSSM. Cannot be 0 or higher than 4.

##### cl\_render\_shadow\_pssm\_update\_frequency\_offset &lt;value&gt;

**Type:** String

Update frequency for PSSM shadows in frames, relative to 'cl\_render\_shadow\_update\_frequency'.

##### cl\_render\_shadow\_resolution &lt;value&gt;

**Type:** String

Shadowmap Resolution. Higher resolution equals higher quality shadows, but is also more expensive to render.

##### cl\_render\_shadow\_update\_frequency &lt;value&gt;

**Type:** String

Update frequency in frames. 0 = Updates every frame, 1 = Updates every second frame, etc.

##### cl\_render\_ssao &lt;value&gt;

**Type:** String

1 = Screen space ambient occlusion enabled, 0 = disabled.

##### cl\_render\_texture\_filtering &lt;value&gt;

**Type:** String

0 = Nearest Neighbour, 1 = Bilinear Filtering, 2 = Trilinear Filtering, 3 = Antisotropic Filtering x2, 4 = Antisotropic Filtering x4, 5 = Antisotropic Filtering x8, 6 = Antisotropic Filtering x16

##### cl\_render\_texture\_quality &lt;value&gt;

**Type:** String

0 = Minimal, 1 = Low, 2 = Medium, 3 = High, 4 = Very High.

##### cl\_render\_tone\_mapping &lt;value&gt;

**Type:** String

Changes the tone-mapping algorithm to use. -1 = Use the default, 0 = Gamma correction only, 1 = Reinhard, 2 = Hejil-Richard, 3 = Uncharted, 4 = Aces, 5 = Gran Turismo

##### cl\_render\_vr\_enabled &lt;value&gt;

**Type:** String

Turns support for virtual reality on or off.

##### cl\_render\_vsync\_enabled &lt;value&gt;

**Type:** String

Turns vertical sync on or off.

##### cl\_render\_window\_mode &lt;value&gt;

**Type:** String

0 = Fullscreen, 1 = Windowed, 2 = Windowed no-border.

##### cl\_show\_fps &lt;value&gt;

**Type:** String

Displays the current fps at the top left of the screen if enabled.

##### cl\_steam\_audio\_ambisonics\_order &lt;value&gt;

**Type:** String

The amount of directional detail in the simulation results. Range: \[0,3\].

##### cl\_steam\_audio\_enabled &lt;value&gt;

**Type:** String

Enables or disables steam audio.

##### cl\_steam\_audio\_ir\_duration &lt;value&gt;

**Type:** String

The time delay between a sound being emitted and the last audible reflection. Range: \[0.5,4.0\].

##### cl\_steam\_audio\_number\_of\_bounces &lt;value&gt;

**Type:** String

The maximum number of times any ray can bounce within the scene. Range: \[1,32\].

##### cl\_steam\_audio\_number\_of\_diffuse\_samples &lt;value&gt;

**Type:** String

The number of directions to consider when a ray bounces off a diffuse (or partly diffuse) surface. Range: \[32,4096\].

##### cl\_steam\_audio\_number\_of\_rays &lt;value&gt;

**Type:** String

The number of rays to trace from the listener. Range: \[1024,131072\].

##### cl\_steam\_audio\_propagation\_delay\_enabled &lt;value&gt;

**Type:** String

Enables or disables propagation delay if steam audio is enabled.

##### cl\_steam\_audio\_reverb\_enabled &lt;value&gt;

**Type:** String

Enables the reverb DSP effect.

##### cl\_steam\_audio\_reverb\_indirect\_binaural &lt;value&gt;

**Type:** String

Spatialize reverb using HRTF.

##### cl\_steam\_audio\_reverb\_simulation\_type &lt;value&gt;

**Type:** String

Real-time or baked. 0 = Real-time, 1 = Baked.

##### cl\_steam\_audio\_spatialize\_air\_absorption &lt;value&gt;

**Type:** String

Enable air absorption.

##### cl\_steam\_audio\_spatialize\_direct\_binaural &lt;value&gt;

**Type:** String

Spatialize direct sound using HRTF.

##### cl\_steam\_audio\_spatialize\_direct\_level &lt;value&gt;

**Type:** String

Relative level of direct sound. Range: \[0,1\].

##### cl\_steam\_audio\_spatialize\_distance\_attenuation &lt;value&gt;

**Type:** String

Enable distance attenuation. If disabled, regular distance attenuation will be used instead.

##### cl\_steam\_audio\_spatialize\_enabled &lt;value&gt;

**Type:** String

Enables the spatialize DSP effect.

##### cl\_steam\_audio\_spatialize\_hrtf\_interpolation &lt;value&gt;

**Type:** String

HRTF interpolation. 0 = Nearest, 1 = Bilinear.

##### cl\_steam\_audio\_spatialize\_indirect &lt;value&gt;

**Type:** String

Enable indirect sound.

##### cl\_steam\_audio\_spatialize\_indirect\_binaural &lt;value&gt;

**Type:** String

Spatialize indirect sound using HRTF.

##### cl\_steam\_audio\_spatialize\_indirect\_level &lt;value&gt;

**Type:** String

Relative level of indirect sound. Range: \[0,10\].

##### cl\_steam\_audio\_spatialize\_occlusion\_method &lt;value&gt;

**Type:** String

Direct occlusion algorithm. 0 = Raycast, 1 = Partial.

##### cl\_steam\_audio\_spatialize\_occlusion\_mode &lt;value&gt;

**Type:** String

Direct occlusion and transmission mode. 0 = Off, 1 = On, No Transmission, 2 = On, Frequency Independent Transmission, 3 = On, Frequency Dependent Transmission.

##### cl\_steam\_audio\_spatialize\_simulation\_type &lt;value&gt;

**Type:** String

Real-time or baked. 0 = Real-time, 1 = Baked

##### cl\_steam\_audio\_spatialize\_static\_listener &lt;value&gt;

**Type:** String

Uses static listener.

##### cl\_updaterate &lt;value&gt;

**Type:** String

The amount of times per second user input is being transmitted to the server.

##### cl\_voice\_volume &lt;value&gt;

**Type:** String

Volume scale for voice (Coming from players and NPCs).

##### cl\_vr\_hmd\_view\_enabled &lt;value&gt;

**Type:** String

Enables or disables the view for virtual reality (Only works if virtual reality has been enabled in the menu.).

##### cl\_vr\_mirror\_window\_enabled &lt;value&gt;

**Type:** String

Enables or disables the mirror window for virtual reality (Only works if virtual reality has been enabled in the menu.).

##### cl\_water\_surface\_simulation\_edge\_iteration\_count &lt;value&gt;

**Type:** String

The more iterations, the more detailed the water simulation will be, but at a great performance cost.

##### cl\_water\_surface\_simulation\_enable\_gpu\_acceleration &lt;value&gt;

**Type:** String

If enabled, water surfaces will be simulated on the GPU instead of the CPU. This should greatly improve performance in most cases.

##### cl\_water\_surface\_simulation\_spacing &lt;value&gt;

**Type:** String

Grid spacing for simulating water surfaces. Lower values will result in a more detailed simulation, but at a great performance cost.

##### cl\_window\_resolution &lt;value&gt;

**Type:** String

Changes the window resolution.

##### debug\_ai\_navigation &lt;value&gt;

**Type:** String

Displays the current navigation path for all NPCs.

##### debug\_bsp\_lock &lt;value&gt;

**Type:** String

Locks BSP culling so it doesn't change when the camera moves.

##### debug\_bsp\_nodes &lt;value&gt;

**Type:** String

Prints and draws various debug information about the binary space partitioning of the level (if available). 1 = Draw leaf of camera location and all visible leaves, 2 = Same, but doesn't update continuously.

##### debug\_hide\_gui 1/0

**Type:** Boolean

Disables GUI rendering.

##### debug\_nav\_show\_meshes &lt;value&gt;

**Type:** String

Shows the navigation mesh for this map.

##### debug\_occlusion\_culling\_freeze\_camera &lt;value&gt;

**Type:** String

Freezes the current camera position in place for occlusion culling.

##### debug\_particle\_blob\_show\_neighbor\_links &lt;value&gt;

**Type:** String

Displays the links to adjacent neighbors for blob particles.

##### debug\_physics\_draw &lt;value&gt;

**Type:** String

Draws various physics information as wireframe.

##### debug\_profiling\_enabled &lt;value&gt;

**Type:** String

Enables profiling timers.

##### debug\_render\_lock\_render\_command\_buffers &lt;value&gt;

**Type:** String

Locks the current render command buffers and causes them to not be re-created every frame.

##### debug\_render\_lock\_render\_queues &lt;value&gt;

**Type:** String

Locks the current render queues and effectively disables the render queue thread.

##### debug\_render\_normals &lt;value&gt;

**Type:** String

Displays all normals as lines in the world. 0 = Disabled, 1 = Display normals, 2 = Display normals, tangents and bitangents, 3 = Display face normals, 4 = Display tangents, 5 = Display bitangents.

##### debug\_render\_octree\_dynamic\_draw &lt;value&gt;

**Type:** String

Draws the octree for dynamic objects.

##### debug\_render\_octree\_static\_draw &lt;value&gt;

**Type:** String

Draws the octree for static world geometry.

##### debug\_steam\_audio\_probe\_boxes &lt;value&gt;

**Type:** String

Displays the sound probe spheres for the current map.

##### host\_timescale &lt;value&gt;

**Type:** String

Specifies the timescale. A value of 2 means the game will run at twice the default speed.

##### log\_enabled &lt;value&gt;

**Type:** String

0 = Log disabled; 1 = Log errors only; 2 = Log errors and warnings; 3 = Log all console output

##### log\_file &lt;value&gt;

**Type:** String

The log-file the console output will be logged to.

##### lua\_open\_editor\_on\_error &lt;value&gt;

**Type:** String

1 = Whenever there's a Lua error, the engine will attempt to automatically open a Lua IDE and open the file and line which caused the error.

##### net\_graph &lt;value&gt;

**Type:** String

Displays a graph about current network transmissions.

##### net\_library &lt;netLibrary&gt;

**Type:** String

The underlying networking library to use for multiplayer games.

##### password &lt;value&gt;

**Type:** String

Password which will be used for the next connection attempt.

##### phys\_engine &lt;physEngie&gt;

**Type:** String

The underlying physics engine to use.

##### playername &lt;value&gt;

**Type:** String

Local player name.

##### rcon\_password &lt;value&gt;

**Type:** String

Specifies a password which can be used to run console commands remotely on a server. If no password is specified, this feature is disabled.

##### render\_api &lt;renderApi&gt;

**Type:** String

The underlying rendering API to use.

##### render\_bloom\_amount &lt;value&gt;

**Type:** String

Number of render passes to use for bloom.

##### render\_bloom\_enabled &lt;value&gt;

**Type:** String

Enables or disables bloom and glow effects.

##### render\_bloom\_resolution &lt;value&gt;

**Type:** String

The width for the bloom texture. The height will be calculated using the aspect ratio of the renderer.

##### render\_clear\_scene &lt;value&gt;

**Type:** String

0 = Default, 1 = Screen is cleared before scene is rendered.

##### render\_clear\_scene\_color &lt;value&gt;

**Type:** String

Clear color to use if render\_clear\_scene is set to 1.

##### render\_csm\_max\_distance &lt;value&gt;

**Type:** String

The maximum distance at which csm shadows are casted. A larger distance means lower quality.

##### render\_debug\_mode 1/0

**Type:** Boolean

0 = Disabled, 1 = Ambient Occlusion, 2 = Albedo Colors, 3 = Metalness, 4 = Roughness, 5 = Diffuse Lighting, 6 = Normals, 7 = Normal Map, 8 = Reflectance, 9 = IBL Prefilter, 10 = IBL Irradiance, 11 = Emission, 12 = Lightmaps, 13 = Lightmap Uvs, 14 = Unlit, 15 = Show CSM cascades, 16 = Shadow Map Depth, 17 = Forward+ Heatmap.

##### render\_draw\_dynamic &lt;value&gt;

**Type:** String

1 = Default, 0 = Don't draw props.

##### render\_draw\_glow &lt;value&gt;

**Type:** String

1 = Default, 0 = Glow-effects aren't drawn.

##### render\_draw\_particles &lt;value&gt;

**Type:** String

1 = Default, 0 = Particles aren't drawn.

##### render\_draw\_scene &lt;value&gt;

**Type:** String

1 = Default, 0 = Scene isn't drawn.

##### render\_draw\_sky &lt;value&gt;

**Type:** String

1 = Default, 0 = Sky isn't drawn.

##### render\_draw\_static &lt;value&gt;

**Type:** String

1 = Default, 0 = Don't draw level geometry.

##### render\_draw\_translucent &lt;value&gt;

**Type:** String

1 = Default, 0 = Don't draw translucent objects.

##### render\_draw\_view &lt;value&gt;

**Type:** String

1 = Default, 0 = View-Models aren't drawn.

##### render\_draw\_water &lt;value&gt;

**Type:** String

1 = Default, 0 = Water isn't drawn.

##### render\_draw\_world &lt;value&gt;

**Type:** String

1 = Default, 2 = Wireframe, 0 = Don't draw world.

##### render\_dynamic\_lighting\_enabled 1/0

**Type:** Boolean

Enables or disables dynamic lighting.

##### render\_dynamic\_shadows\_enabled 1/0

**Type:** Boolean

Enables or disables dynamic shadows.

##### render\_forwardplus\_tile\_size &lt;value&gt;

**Type:** String

Changes the tile size used for the light culling in forward+.

##### render\_hdr\_max\_exposure &lt;value&gt;

**Type:** String

Expore will be clamped at this value. Can be overwritten by the map.

##### render\_ibl\_enabled 1/0

**Type:** Boolean

Enables or disables image-based lighting.

##### render\_instancing\_enabled 1/0

**Type:** Boolean

Enables or disables instanced rendering.

##### render\_instancing\_threshold \[2,inf\]

**Type:** UInt32

The threshold at which to start instancing entities if instanced rendering is enabled (render\_instancing\_threshold). Must not be lower than 2!

##### render\_multithreaded\_rendering\_enabled 1/0

**Type:** Boolean

Enables or disables multi-threaded rendering. Some renderers (like OpenGL) don't support multi-threaded rendering and will ignore this flag.

##### render\_normalmapping\_enabled &lt;value&gt;

**Type:** String

1 = Normal mapping enabled, 0 = disabled.

##### render\_pp\_nightvision &lt;value&gt;

**Type:** String

Enables or disables night vision.

##### render\_pp\_nightvision\_color\_amplification &lt;value&gt;

**Type:** String

Amplification factor for pixels with low luminance.

##### render\_pp\_nightvision\_luminance\_threshold &lt;value&gt;

**Type:** String

Changes the luminance threshold for the night vision post-processing effect.

##### render\_pp\_nightvision\_noise\_texture &lt;value&gt;

**Type:** String

Noise texture to use for the night vision post-processing effect.

##### render\_queue\_entities\_per\_worker\_job \[1,50\]

**Type:** UInt32

Number of entities for each job processed by a worker thread.

##### render\_queue\_worker\_jobs\_per\_batch \[0,10\]

**Type:** UInt32

Number of worker jobs to accumulate in a batch before assigning a worker.

##### render\_queue\_worker\_thread\_count \[1,10\]

**Type:** UInt32

Number of threads to use for generating render queues.

##### render\_shadow\_quality &lt;value&gt;

**Type:** String

Shadowmap Quality. This affects the detail of the object shadows that are being rendered

##### render\_technique &lt;value&gt;

**Type:** String

0 = Rasterization, 1 = Raytracing

##### render\_texture\_filtering &lt;value&gt;

**Type:** String

0 = Nearest-Neighbor, 1 = Bilinear, 2 = trilinear.

##### render\_vsync\_enabled &lt;value&gt;

**Type:** String

1 = Vertical sync enabled, 0 = disabled.

##### sh\_lua\_remote\_debugging &lt;value&gt;

**Type:** String

0 = Remote debugging is disabled; 1 = Remote debugging is enabled serverside; 2 = Remote debugging is enabled clientside. Cannot be changed during an active game. Also requires the "-luaext" launch parameter. Remote debugging cannot be enabled clientside and serverside at the same time.

##### sh\_mount\_external\_game\_resources &lt;value&gt;

**Type:** String

If set to 1, the game will attempt to load missing resources from external games.

##### sky\_override &lt;value&gt;

**Type:** String

Replaces the material for all current skyboxes with the specified material.

##### steam\_steamworks\_enabled &lt;value&gt;

**Type:** String

Enables or disables steamworks.

##### sv\_acceleration &lt;value&gt;

**Type:** String

Player acceleration. If this is too low, the player will be unable to reach full movement speed due to friction forces.

##### sv\_allowcslua &lt;value&gt;

**Type:** String

1 = Clients can run own clientside scripts, 0 = Custom clientside scripts aren't allowed.

##### sv\_allowdownload &lt;value&gt;

**Type:** String

Specifies whether clients are allowed to download resources from the server.

##### sv\_allowupload &lt;value&gt;

**Type:** String

Specifies whether clients are allowed to upload resources to the server (e.g. spraylogos).

##### sv\_cheats &lt;value&gt;

**Type:** String

Allows clients to run console commands which are marked as cheats if set to 1.

##### sv\_debug\_physics\_draw &lt;value&gt;

**Type:** String

Draws various serverside physics information as wireframe.

##### sv\_friction &lt;value&gt;

**Type:** String

Global friction scale.

##### sv\_gamemode &lt;value&gt;

**Type:** String

Gamemode which should be used when starting a game.

##### sv\_gravity &lt;value&gt;

**Type:** String

Specifies the default gravity force and direction. Certain entities may overwrite this for themselves.

##### sv\_maxplayers &lt;value&gt;

**Type:** String

Specifies the maximum amount of players that are allowed to join the server.

##### sv\_noclip\_speed &lt;value&gt;

**Type:** String

The speed at which players can move in noclip mode.

##### sv\_password &lt;value&gt;

**Type:** String

Sets a password for the server. No player will be able to join, unless they provide the correct password using the 'password' command.

##### sv\_physics\_simulation\_enabled &lt;value&gt;

**Type:** String

Enables or disables physics simulation.

##### sv\_player\_air\_move\_scale &lt;value&gt;

**Type:** String

The scale at which players are still able to move while in the air. 0 = Players can't move until they've landed, 1 = Players can move freely while in the air

##### sv\_port\_tcp &lt;value&gt;

**Type:** String

TCP port which will be used when starting a server.

##### sv\_port\_udp &lt;value&gt;

**Type:** String

UDP port which will be used when starting a server.

##### sv\_require\_authentication 1/0

**Type:** Boolean

If enabled, clients will have to authenticate via steam to join the server.

##### sv\_restitution &lt;value&gt;

**Type:** String

Global restitution scale.

##### sv\_servername &lt;value&gt;

**Type:** String

The server name which will be displayed in the server browser.

##### sv\_tickrate &lt;value&gt;

**Type:** String

Specifies the tickrate. A higher tickrate means smoother and more reliable physics, but also more data to transmit to clients. Higher values can result in more lag for clients.

##### sv\_timeout\_duration &lt;value&gt;

**Type:** String

Amount of time until a client is forcibly dropped if no data has been received.

##### sv\_use\_p2p\_if\_available &lt;value&gt;

**Type:** String

Use a peer-to-peer connection if the selected networking layer supports it.

##### sv\_water\_surface\_simulation\_edge\_iteration\_count &lt;value&gt;

**Type:** String

The more iterations, the more detailed the water simulation will be, but at a great performance cost.

##### sv\_water\_surface\_simulation\_shared &lt;value&gt;

**Type:** String

If enabled, water surface simulation will be shared between client and server (Simulation is only performed once). This will only have an effect in single-player or on listen servers.

# Commands

##### +attack

Triggers the primary fire for the player character's equipped weapon.

##### +attack2

Triggers the secondary fire for the player character's equipped weapon.

##### +attack3

Triggers the tertiary fire for the player character's equipped weapon.

##### +attack4

Triggers the quaternary fire for the player character's equipped weapon.

##### +backward

Moves the player character backward while active.

##### +crouch

Prompts the player character to crouch.

##### +forward

Moves the player character forward while active.

##### +jump

Prompts the player character to jump.

##### +left

Moves the player character left while active.

##### +reload

Triggers the reload for the player character's equipped weapon.

##### +right

Moves the player character right while active.

##### +sprint

Enables sprinting while moving forward.

##### +turn\_down

Continuously turns the player character leftwards.

##### +turn\_left

Continuously turns the player character leftwards.

##### +turn\_right

Continuously turns the player character leftwards.

##### +turn\_up

Continuously turns the player character leftwards.

##### +use

Prompts the player character to use whatever is in front of him.

##### +walk

Enables walking while moving forward.

##### -attack

Triggers the primary fire for the player character's equipped weapon.

##### -attack2

Triggers the secondary fire for the player character's equipped weapon.

##### -attack3

Triggers the tertiary fire for the player character's equipped weapon.

##### -attack4

Triggers the quaternary fire for the player character's equipped weapon.

##### -backward

Moves the player character backward while active.

##### -crouch

Prompts the player character to crouch.

##### -forward

Moves the player character forward while active.

##### -jump

Prompts the player character to jump.

##### -left

Moves the player character left while active.

##### -reload

Triggers the reload for the player character's equipped weapon.

##### -right

Moves the player character right while active.

##### -sprint

Enables sprinting while moving forward.

##### -turn\_down

Continuously turns the player character leftwards.

##### -turn\_left

Continuously turns the player character leftwards.

##### -turn\_right

Continuously turns the player character leftwards.

##### -turn\_up

Continuously turns the player character leftwards.

##### -use

Prompts the player character to use whatever is in front of him.

##### -walk

Enables walking while moving forward.

##### asset\_clear\_unused

Clears all unused assets from memory.

##### asset\_clear\_unused\_materials

Clears all unused materials from memory.

##### asset\_clear\_unused\_models

Clears all unused models from memory.

##### asset\_clear\_unused\_textures

Clears all unused textures from memory.

##### bind

Binds a key to a command string. Usage: bind &lt;key&gt; &lt;command&gt;

##### bind\_keys

Prints a list of all bindable keys to the console.

##### cl\_debug\_netmessages

Prints out debug information about recent net-messages.

##### cl\_entities

Prints a list of all current clientside entities in the world.

##### cl\_find

Finds similar console commands to whatever was given as argument.

##### cl\_gpu\_timer\_queries\_dump

Prints all timer query results to the console.

##### cl\_list

Prints a list of all clientside console commands to the console.

##### cl\_send

Sends a text message to the server and displays it in the console. Usage: cl\_send &lt;message&gt;

##### cl\_send\_udp

Sends a text message to the server via UDP and displays it in the console. Usage: cl\_send\_udp &lt;message&gt;

##### cl\_steam\_audio\_reload\_scene

Reloads the steam audio scene cache.

##### clear

Clears everything in the console.

##### clear\_cache

Clears all of the cached engine files.

##### closeserver

Closes the server (if active) and drops all connected clients.

##### connect

Attempts to connect to the specified server. Usage: connect &lt;ipV6/ipV4&gt; or connect &lt;steamId&gt; or without arguments to re-try the last attempt.

##### crash

Forces the engine to crash.

##### credits

Prints a list of developers.

##### debug\_ai\_schedule

Prints the current schedule behavior tree for the specified NPC on screen.

##### debug\_ai\_schedule\_print

Prints the current schedule behavior tree for the specified NPC.

##### debug\_aim\_info

Prints information about whatever the local player is looking at.

##### debug\_audio\_aux\_effect

Applies a global DSP effect. Usage: debug\_audio\_aux\_effect &lt;dspName&gt; &lt;gain&gt;

##### debug\_audio\_sounds

Prints information about all active server- and clientside sounds to the console.

##### debug\_dump\_shader\_code

Dumps the glsl code for the specified shader.

##### debug\_font

Displays the glyph map for the specified font. If no arguments are specified, all available fonts will be listed. Usage: debug\_font &lt;fontName&gt;

##### debug\_font\_glyph\_map

Displays the glyph map for the specified font.

##### debug\_glow\_bloom

Displays the scene glow texture on screen. Usage: debug\_glow\_bloom &lt;1/0&gt;

##### debug\_gui\_cursor

Prints information about the GUI element currently hovered over by the cursor.

##### debug\_hdr\_bloom

Displays the scene bloom texture on screen. Usage: debug\_hdr\_bloom &lt;1/0&gt;

##### debug\_hitboxes

Displays the hitboxes for the entity under the crosshair, or the entity with the given name (If it was specified.).

##### debug\_light\_shadowmap

Displays the depth map for the given light on screen. Call without arguments to turn the display off. Usage: debug\_light\_shadowmap &lt;lightEntityIndex&gt;

##### debug\_light\_sources

Prints debug information about all light sources in the scene.

##### debug\_lightmaps

Displays the lightmaps for the loaded level.

##### debug\_nav\_path\_end

Sets an end point for a navigation path. Use debug\_nav\_path\_start to set the start point. The path will be drawn in the scene once both points have been set.

##### debug\_nav\_path\_start

Sets a start point for a navigation path. Use debug\_nav\_path\_end to set the end point.

##### debug\_particle\_alpha\_mode

Specifies the blend mode arguments for particle systems that use the 'custom' alpha mode. Argument order: &lt;srcColorBlendFactor&gt; &lt;dstColorBlendFactor&gt; &lt;srcAlphaBlendFactor&gt; &lt;dstAlphaBlendFactor&gt; &lt;opColor&gt; &lt;opAlpha&gt;. Blend factor options: zero, one, src\_color, one\_minus\_src\_color, dst\_color, one\_minus\_dst\_color, src\_alpha, one\_minus\_src\_alpha, dst\_alpha, one\_minus\_dst\_alpha, constant\_color, one\_minus\_constant\_color, constant\_alpha, one\_minus\_constant\_alpha, src\_alpha\_saturate, src1\_color, one\_minus\_src1\_color, src1\_alpha, one\_minus\_src1\_alpha Operation options: add, subtract, reverse\_subtract, min, max

##### debug\_pbr\_ibl

Displays the irradiance, prefilter and brdf map for the closest cubemap.

##### debug\_prepass

Displays prepass buffers to screen.

##### debug\_profiling\_physics\_end

Prints physics profiling information for the last simulation step.

##### debug\_profiling\_physics\_start

Prints physics profiling information for the last simulation step.

##### debug\_profiling\_print

Prints the last profiled times.

##### debug\_render\_depth\_buffer

Draws the scene depth buffer to screen.

##### debug\_render\_info

Prints some timing information to the console.

##### debug\_render\_memory\_budget

Prints information about the current GPU memory budget.

##### debug\_render\_memory\_stats

Prints statistics about the current GPU memory usage.

##### debug\_render\_octree\_dynamic\_find

Finds the specified entity in the octree for dynamic objects.

##### debug\_render\_octree\_dynamic\_print

Prints the octree for dynamic objects to the console, or a file if a file name is specified.

##### debug\_render\_octree\_static\_print

Prints the octree for static world geometry to the console, or a file if a file name is specified.

##### debug\_render\_scene

Displays scene to screen.

##### debug\_render\_stats

Prints information about the next frame.

##### debug\_render\_validation\_error\_enabled

Enables or disables the specified validation error.

##### debug\_ssao

Displays the ssao buffers to screen.

##### debug\_steam\_audio\_dump\_scene

Saves the steam audio scene as OBJ file.

##### debug\_texture\_mipmaps

Displays the mipmaps of the given texture. Usage: debug\_texture\_mipmaps &lt;texturePath&gt;

##### debug\_textures

Prints information about the currently loaded textures.

##### debug\_water

Displays the reflection, refraction and refraction depth map for the given water-entity on screen. Call without arguments to turn the display off. Usage: debug\_light\_water &lt;waterEntityIndex&gt;

##### disconnect

Disconnects from the server (if a connection is active), or closes the game if in single player mode.

##### drop

Drops the player's active weapon.

##### echo

Prints something to the console. Usage: echo &lt;message&gt;

##### ent\_create

Creates and spawns a new entity with the given class name at the position in the world the player is looking at. Usage: ent\_create &lt;className&gt;

##### ent\_input

Triggers the given input on the specified entity. Usage: ent\_input &lt;entityName/entityClass&gt; &lt;input&gt;

##### ent\_remove

Removes the specified entity, or the entity the player is looking at if no argument is provided. Usage: ent\_remove &lt;entityName/className&gt;

##### ent\_scale

Changes the scale of the specified entity. Usage: ent\_input &lt;entityName/entityClass&gt; &lt;scale&gt;

##### entities

Prints a list of all current serverside entities in the world.

##### exec

Executes a config file. Usage exec &lt;fileName&gt;

##### exit

Exits the game.

##### find

Finds similar console commands to whatever was given as argument.

##### flashlight

Toggles the flashlight.

##### fps

Prints the current fps to the console.

##### getang

Prints the current angles of the local player to the console.

##### getcamang

Prints the current angles of the camera to the console.

##### getcampos

Prints the current position of the camera.

##### getpos

Prints the current position of the local player to the console.

##### give\_ammo

Gives the local player the specified ammunition.

##### give\_weapon

Gives the local player the specified weapon and deploys it.

##### godmode

Toggles god mode. Requires cheats to be enabled (Or single player mode running).

##### heartbeat

Instantly sends a heartbeat to the master server.

##### help

Find help about a convar/concommand.

##### hurtme

Applies the specified amount of damage to self.

##### keymappings

Prints a list of all active key bindings to the console.

##### kick

Kicks the specified player for the given reason. Usage: kick &lt;playerId/playerName&gt; &lt;reason&gt;

##### list

Prints a list of all serverside console commands to the console.

##### list\_maps

Prints a list of all available list to the console.

##### listmaps

##### load

##### loc\_reload

Reloads all localization files.

##### log

Adds the specified message to the engine log. Usage: log &lt;msg&gt;.

##### lua\_compile

Opens the specified lua-file and outputs a precompiled file with the same name (And the extension '.clua').

##### lua\_exec

Opens and executes a lua-file on the server.

##### lua\_exec\_cl

Opens and executes a lua-file on the client.

##### lua\_help

Prints information about the specified function, library or enum (or the closest candiate). Usage: lua\_help &lt;function/library/enum&gt;.

##### lua\_reload\_entities

Reloads the scripts for all registered lua entity classes.

##### lua\_reload\_entity

Reloads the scripts for the given entity class. Usage: lua\_reload\_entity &lt;className&gt;

##### lua\_reload\_weapon

Reloads the scripts for the given weapon class. Usage: lua\_reload\_weapon &lt;className&gt;

##### lua\_reload\_weapons

Reloads the scripts for all registered lua weapon classes.

##### lua\_run

Runs a lua command on the server lua state.

##### lua\_run\_cl

Runs a lua command on the client lua state.

##### lua\_run\_gui

Runs a lua command on the GUI lua state.

##### map

Loads the given map immediately. Usage: map &lt;mapName&gt;

##### map\_build\_reflection\_probes

Build all reflection probes in the map. Use the '-rebuild' argument to clear all current IBL textures first. Use 'debug\_pbr\_ibl' to check the probes after they have been built.

##### map\_rebuild\_lightmaps

Rebuilds the lightmaps for the current map. Note that this will only work if the map was compiled with lightmap uvs.

##### nav\_generate

Generates a navigation mesh for the current map and saves it as a navigation file.

##### nav\_reload

Reloads the navigation mesh for the current map.

##### next\_weapon

Switches to the next weapon in the player's inventory.

##### noclip

Toggles noclip mode. Requires cheats to be enabled (Or single player mode running).

##### notarget

Toggles notarget mode. Requires cheats to be enabled (Or single player mode running).

##### previous\_weapon

Switches to the previous weapon in the player's inventory.

##### quit

Exits the game.

##### rcon

Sends the given command to the server and runs it serverside. Usage: rcon &lt;command&gt;

##### reloadmaterial

Reloads the given material (and textures associated with it). Usage: reloadmaterial &lt;materialFile&gt;

##### reloadmaterials

Reloads all loaded materials and textures.

##### render\_api\_info

Prints information about the current render API to the console.

##### save

##### screenshot

Writes the contents of the screen into a .tga-file in 'screenshots/'. The name of the file will start with the map's name, or 'pragma' if no map is loaded. After the name follows an ID which is incremented each time. You can use 'screenshot 1' to take a screenshot without the GUI (Ingame only).

##### setang

Changes the angles of the local player. Requires cheats to be enabled. Usage: setang &lt;pitch&gt; &lt;yaw&gt; &lt;roll&gt;

##### setpos

Changes the position of the local player. Requires cheats to be enabled. Usage: setpos &lt;x&gt; &lt;y&gt; &lt;z&gt;

##### shader\_list

Prints a list of all currently loaded shaders

##### shader\_optimize

Uses LunarGLASS to optimize the specified shader.

##### shader\_reload

Reloads a specific shader, or all registered shaders if no arguments are given. Usage: shader\_reload &lt;shaderName&gt;

##### sound\_play

Precaches and immediately plays the given sound file. Usage: sound\_play &lt;soundFile&gt;

##### sound\_stop

Stops all sounds that are currently playing.

##### startserver

Starts an internet server. Requires a running game.

##### status

Prints information about the current connection to the console.

##### strip\_weapons

Strips all weapons from the local player.

##### suicide

Commit suicide.

##### sv\_debug\_netmessages

Prints out debug information about recent net-messages.

##### sv\_send

Sends a text message to all connected clients and displays it in the console. Usage: sv\_send &lt;message&gt;

##### sv\_send\_udp

Sends a text message to all connected clients via UDP and displays it in the console. Usage: sv\_send\_udp &lt;message&gt;

##### thirdperson

Toggles between first- and third-person mode.

##### toggle

Toggles the specified console variable between 0 and 1.

##### toggleconsole

Toggles the developer console.

##### udm\_convert

Converts a UDM file from binary to ASCII or the other way around.

##### udm\_validate

Validates the specified UDM file.

##### unbind

Unbinds the given key.

##### unbindall

Unbinds all keys.

##### version

Prints the current engine version to the console.

##### vk\_dump\_extensions

Dumps all available vulkan extensions to 'vk\_extensions.txt'.

##### vk\_dump\_features

Dumps all vulkan features to 'vk\_features.txt'.

##### vk\_dump\_format\_properties

Dumps all vulkan format properties to 'vk\_format\_properties.txt'.

##### vk\_dump\_image\_format\_properties

Dumps all vulkan image format properties to 'vk\_image\_format\_properties.txt'.

##### vk\_dump\_layers

Dumps all available vulkan layers to 'vk\_layers.txt'.

##### vk\_dump\_limits

Dumps all vulkan limitations to 'vk\_limits.txt'.

##### vk\_dump\_memory\_stats

Dumps information about currently allocated GPU memory.

##### vk\_print\_memory\_stats

Prints information about currently allocated GPU memory to the console.

# Game Mounting

Pragma can automatically import assets that can't be found in its native formats from one of the mounted games. The default list of mounted games includes all Valve Source Engine games, as well as a few popular mods, but in some cases you may want to add custom entries. This is currently only possible by editing the list of mounted games in a text-editor manually.

To do so, go to "Pragma/cfg" and open "mounted\_games.udm" in a text-editor. Scroll to the end of the file and add the following entry:

```
"<identifier>"
{
	$bool enabled 1
	"steam"
	{
		$uint32 app_id <appId>
		$string game_path "<gamePath>"
		$bool mount_workshop <mountWs>
	}
	"engine"
	{
		$string name "source_engine"
	}
}
```

Replace the following attributes:

- `<identifier>:` A unique identifier for this game. Make sure the name is lowercase, has no spaces and no special characters, and isn't already used for any other entries.
- `<appId>:` The Steam App Id of the game. You can find it by entering the game's name on [SteamDB](https://steamdb.info/).
- `<gamePath>:` The path to the game's assets, relative to "steamapps/". This path should contain a "models", "materials" and "maps" directory. For example, if the full path is "E:/SteamLibrary/steamapps/common/Counter-Strike Global Offensive/csgo", the `<gamePath>` should be "common/Counter-Strike Global Offensive/csgo/". Make sure to use this exact format (forward slashes; not starting with a slash; ending with a slash).
- `<mountWs>:` Set to `1` if you want to mount the workshop for the specified game, otherwise `0`.

You can use the other entries as a reference. If you've made a syntax error, it should appear in the console the next time you start Pragma. You can also run the console command `udm_validate cfg/mounted_games.udm` to ensure the file is syntactically correct.

If your new entry doesn't seem to have any effect, you can start Pragma with the `-verbose -console terminal` launch parameters, and it should print out a bunch of information about the mounted games and any errors.

### Mounting custom SFM user folders

If your assets are located in a custom directory under "steamapps/common/SourceFilmmaker/game/", it will not be mounted by default. To mount it, open "Pragma/cfg/mounted\_games.udm" in a text-editor, find the "sfm" entry and add the path to the "game\_paths" list (replace `<your_custom_folder>` with the name of your custom directory):

```
"sfm"
{
	$bool enabled 1
	$string localization_name "mount_game_sfm"
	$int32 priority 950
	"steam"
	{
		$uint32 app_id 1840
		$array game_paths [string][
			"common/SourceFilmmaker/game/usermod/",
			"common/SourceFilmmaker/game/workshop/",
			"common/SourceFilmmaker/game/tf_movies/",
			"common/SourceFilmmaker/game/tf/",
			"common/SourceFilmmaker/game/hl2/",
			"common/SourceFilmmaker/game/left4dead2_movies/",
			"common/SourceFilmmaker/game/platform/",
			"common/SourceFilmmaker/game/portal2/",
			"common/SourceFilmmaker/game/<your_custom_folder>/"
		]
		$bool mount_workshop 1
	}
	"engine"
	{
		$string name "source_engine"
	}
}
```

# Developer Documentation

# Building Pragma

You can also find these build instructions on the [Pragma repository](https://github.com/Silverlan/pragma#readme) on GitHub.

## Build Requirements

- ~50 GiB of disk space
- CMake 3.21.4 or newer
- Python 3.9.5 or newer

###### **Windows**

- Visual Studio 2022 or newer

###### **Linux**

- clang-14 or newer (Pragma is *not* compatible with gcc!)

## Build Instructions

Launch a command-line interface and clone the pragma repository (with submodules) into a directory of your choice:

```shell
git clone https://github.com/Silverlan/pragma.git --recurse-submodules
```

After that you can simply navigate to the pragma directory and run the python build-script, which will automatically download all dependencies, configure CMake, and build and install the project (this will take several hours):

```shell
python build_scripts/build.py --with-pfm --with-all-pfm-modules --with-vr
```

<p class="callout info">If you don't need the filmmaker, you can omit the `--with-pfm --with-all-pfm-modules` arguments, which will significantly reduce the build time and the required amount of disk space.</p>

###### *Linux*

<p class="callout warning">Before running the build script, you will have to install the following packages:</p>

```shell
# Required for the build script
sudo apt-get install python3

# Required for Pragma core
sudo apt install build-essential
sudo add-apt-repository ppa:savoury1/llvm-defaults-14
sudo apt update
sudo apt install clang-14
sudo apt install libstdc++-12-dev
sudo apt install libstdc++6
sudo apt-get install patchelf

# Required for Vulkan
sudo apt-get -qq install -y libwayland-dev libxrandr-dev

sudo apt-get install libxcb-keysyms1-dev
sudo apt-get install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev

# Required for GLFW
sudo apt install xorg-dev

# Required for OIDN
sudo apt install git-lfs

# Required for Cycles
sudo apt-get install subversion

# Required for Curl
sudo apt-get install libssl-dev
sudo apt install libssh2-1

# Required for OIIO
sudo apt-get install python3-distutils
```

Once the build script has been completed, you should find the build files in `pragma/build`, and the install files in `pragma/build/install`. The `install` directory should contain everything you need to run Pragma.

If you make any code changes to the core engine code, you can build the `pragma-install` target to build them. This will also re-install the binaries.

If you make any code changes to a module, you will have to build the module build target first, and then build `pragma-install` afterwards.

###  

### Build Customization

Running the build-script with the arguments above will build and install Pragma and the Pragma Filmmaker with all dependencies. Alternatively you can also configure the build to your liking with the following parameters:

<table border="1" id="bkmrk---help-display-this-" style="border-collapse: collapse; width: 98.7654%; height: 1012px;"><tbody><tr><td style="width: 30%;">**Parameter**</td><td style="width: 45%;">**Description**</td><td style="width: 25%;">**Default**</td></tr><tr style="height: 30px;"><td style="width: 30%; height: 30px;">`--help`</td><td style="width: 45%; height: 30px;">Display this help</td><td style="width: 25%; height: 30px;"> </td></tr><tr style="height: 81px;"><td style="width: 30%; height: 81px;">`--generator <generator>`</td><td style="width: 45%; height: 81px;">The generator to use.</td><td style="width: 25%; height: 81px;">`Visual Studio 17 2022` (On Windows)

`Unix Makefiles` (On Linux)

</td></tr><tr style="height: 47px;"><td style="width: 30%; height: 47px;">`--c-compiler`</td><td style="width: 45%; height: 47px;">\[Linux only\] The C-compiler to use.</td><td style="width: 25%; height: 47px;">`clang-14`</td></tr><tr style="height: 64px;"><td style="width: 30%; height: 64px;">`--cxx-compiler`</td><td style="width: 45%; height: 64px;">\[Linux only\] The C++-compiler to use.</td><td style="width: 25%; height: 64px;">`clang++-14`</td></tr><tr style="height: 63px;"><td style="width: 30%; height: 63px;">`--with-essential-client-modules <1/0>`</td><td style="width: 45%; height: 63px;">Include essential modules required to run Pragma.</td><td style="width: 25%; height: 63px;">1</td></tr><tr style="height: 80px;"><td style="width: 30%; height: 80px;">`--with-common-modules <1/0>`</td><td style="width: 45%; height: 80px;">Include non-essential but commonly used modules (e.g. audio and physics modules).</td><td style="width: 25%; height: 80px;">1</td></tr><tr style="height: 46px;"><td style="width: 30%; height: 46px;">`--with-pfm <1/0>`</td><td style="width: 45%; height: 46px;">Include the Pragma Filmmaker.</td><td style="width: 25%; height: 46px;">0</td></tr><tr style="height: 46px;"><td style="width: 30%; height: 46px;">`--with-core-pfm-modules <1/0>`</td><td style="width: 45%; height: 46px;">Include essential PFM modules.</td><td style="width: 25%; height: 46px;">1</td></tr><tr style="height: 63px;"><td style="width: 30%; height: 63px;">`--with-all-pfm-modules <1/0>`</td><td style="width: 45%; height: 63px;">Include non-essential PFM modules (e.g. chromium and cycles).</td><td style="width: 25%; height: 63px;">0</td></tr><tr style="height: 46px;"><td style="width: 30%; height: 46px;">`--with-vr <1/0>`</td><td style="width: 45%; height: 46px;">Include Virtual Reality support.</td><td style="width: 25%; height: 46px;">0</td></tr><tr style="height: 63px;"><td style="width: 30%; height: 63px;">`--build <1/0>`</td><td style="width: 45%; height: 63px;">Build Pragma after configurating and generating build files.</td><td style="width: 25%; height: 63px;">1</td></tr><tr style="height: 64px;"><td style="width: 30%; height: 64px;">`--build-config <config>`</td><td style="width: 45%; height: 64px;">The build configuration to use.</td><td style="width: 25%; height: 64px;">`RelWithDebInfo`</td></tr><tr style="height: 29px;"><td style="width: 30%; height: 29px;">`--build-directory <path>`</td><td style="width: 45%; height: 29px;">Directory to write the build files to. Can be relative or absolute.</td><td style="width: 25%; height: 29px;">`build`</td></tr><tr style="height: 29px;"><td style="width: 30%; height: 29px;">`--deps-directory <path>`</td><td style="width: 45%; height: 29px;">Directory to write the dependency files to. Can be relative or absolute.</td><td style="width: 25%; height: 29px;">`deps`</td></tr><tr style="height: 29px;"><td style="width: 30%; height: 29px;">`--install-directory <path>`</td><td style="width: 45%; height: 29px;">Installation directory. Can be relative (to build directory) or absolute.</td><td style="width: 25%; height: 29px;">`install`</td></tr><tr><td style="width: 30%;">`--verbose <1/0>`</td><td style="width: 45%;">Print additional debug information.</td><td style="width: 25%;">0</td></tr><tr><td style="width: 30%;">`--module <moduleName>:<gitUrl>`</td><td style="width: 45%;">Custom modules to install. Use this argument multiple times to use multiple modules.</td><td style="width: 25%;"> </td></tr></tbody></table>

Example for using the `--module` parameter:

```shell
--module pr_physx:"https://github.com/Silverlan/pr_physx.git"
```

If you want to create your own binary module, please check out the article on [binary modules](https://wiki.pragma-engine.com/books/pragma-engine/page/binary-modules).

# Binary Modules

Binary modules allow you to change or extend the behavior of Pragma without having to change the core source code. Binary modules are written in C++ and loaded during runtime using Lua (with some special exceptions). Some example modules are:

- [pr\_chromium](https://github.com/Silverlan/pr_chromium): Adds an integrated Chromium-based Web Browser to Pragma
- [pr\_openvr](https://github.com/Silverlan/pr_openvr): Adds virtual reality support to Pragma
- [pr\_bullet](https://github.com/Silverlan/pr_bullet): Adds support for the Bullet physics engine to Pragma
- [pr\_physx](https://github.com/Silverlan/pr_physx): Adds support for the PhysX physics engine to Pragma
- [pr\_curl](https://github.com/Silverlan/pr_curl): Adds support for the curl library to Pragma
- [pr\_sqlite](https://github.com/Silverlan/pr_sqlite): Adds SQLite support to Pragma

###  

### Installing Modules

If the binary module is available on GitHub and has at least one release, you can use the following console command in Pragma to install the module directly:

```
install_module <GitHubUser>/<RepoName>
```

For instance, if you want to install the [pr\_curl](https://github.com/Silverlan/pr_curl) module, simply run `install_module Silverlan/pr_curl` in the console, which will automatically download the module and install it.

Alternatively, if a binary module comes with prebuilt binaries, you can simply extract the archive to your Pragma installation directory, the file structure in the archive should ensure that its placed in the correct location. Simple modules that consist of a single library file can usually be found in the "modules" directory, while more complex modules (like chromium) reside in their own sub-directory within "modules".

The module can then be loaded with a simple Lua-script:

```Lua
local moduleName = "chromium/pr_chromium"
local result = engine.load_library(moduleName)
if(result ~= true) then
    console.print_warning("Failed to load \"" .. moduleName .. "\" module: " .. result)
    return
end
```

The module name is the path to the binary file, without the "modules/" prefix and without the file extension. On Linux the module file also has the "lib" prefix, which has to be omitted as well. For instance, if the module filename is "modules/curl/libpr\_curl.so", then the module name should be "curl/pr\_curl".

###  

### Building Modules

If you want to build a module manually, you'll have to first [build Pragma](https://github.com/Silverlan/pragma#build-instructions). You can then add the module to the build instructions by using one of the following methods:

#### Method 1) (Recommended)

Open `pragma/build_scripts/user_modules.py` in a text-editor and follow the instructions to add your module.

After that, simply re-run the build script.

<p class="callout info">Tip: You can use the --rerun option to make the build script re-use the options used in the previous build.</p>

#### Method 2)

You can also add the following option when running the build script:

<div id="bkmrk---module-%3Cname%3E%3A%3Cgit">```
--module <name>:<gitUrl>

```

</div>For instance, if you want to add the `pr_chromium` module to the build:

<div id="bkmrk---module-pr_chromium">```
--module pr_chromium:https://github.com/Silverlan/pr_chromium
```

</div>(You can use the `--module` argument multiple times if you want to add more than one module.)

Once the module has been added to the build, you can simply build the `pragma-install` target. It will build the module and install it automatically. You should then be able to find the module within the "modules" directory of the pragma installation folder.

### Custom Modules

Setting up your own custom module is very simple and only takes a few minutes using the [Pragma module template repository](https://github.com/Silverlan/pr_module_template) on GitHub, which also includes workflows for automated builds and releases.

To do so, go to the template repository and create a new repository from it:

[![github_use_template_repo.png](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/scaled-1680-/firefox-2022-12-05-13-25-40.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/firefox-2022-12-05-13-25-40.png)

You can choose whatever name you want for the repository, but for consistency it is recommended that it should have the same name as the module, which means:

- It should start with the "pr\_" prefix
- It should be all lowercase
- It should only contain letters and underscores

Some examples are: "pr\_chromium", "pr\_bullet", "pr\_audio\_fmod", etc.

Next click "Create repository from template" to generate the repository.

The generated repository now contains a bunch of template files, which still need to be initialized. To do so, open the file "template\_pragma\_module.json" on GitHub and edit the values within:

[![edit_module_template.png](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/scaled-1680-/firefox-2022-12-05-13-32-17.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/firefox-2022-12-05-13-32-17.png)

- **name**: A pretty name, which will appear in the generated readme.
- **module\_name**: The internal name of the module (i.e. the name of the CMake target and the binaries). This name should always start with the prefix `pr_` and always be lowercase. It should match the repository name if possible.
- **install\_directory**: The directory where the module should be installed to, relative to the Pragma installation. Please choose this value carefully:  
    
    - If you know your module is going to be a single binary with no additional files, it's recommended to leave this value at the default ("modules/").
    - If your module requires additional files, it's recommended to change this value to a sub-directory, e.g. "modules/&lt;moduleName&gt;/".
    - If your module requires Lua-scripts or asset files, it's recommended to change this value to an addon path, e.g. "addons/&lt;addonName&gt;/modules/&lt;moduleName&gt;/".
- **release\_directory**: The directory that will be used for the GitHub releases. This value usually depends on the *install\_directory*: 
    - If the *install\_directory* is the default ("modules/"), leave this value empty. In this case only the binary file will be added to the GitHub release.
    - If the *install\_directory* is a sub-directory in "modules/", set this value to the same sub-directory (i.e. the same value as *install\_directory*).
    - If the *install\_directory* points to an addon, set this value to the addon path (e.g. "addons/&lt;addonName&gt;/").

**Example:**

```JSON
{
    "name": "Chromium",
    "module_name": "pr_chromium",
    "install_directory": "addons/chromium_browser/modules/chromium/",
    "release_directory": "addons/chromium_browser/"
}
```

When the module has been built, the binary will be located in "pragma/addons/chromium\_browser/modules/chromium/pr\_chromium.dll" (or "libpr\_chromium.so" for Linux).

The GitHub release will contain all files that are within "pragma/addons/chromium\_browser/". Users will be able to simply extract the release over their Pragma installation to install the module.

Once you have edited the values in the json-file, commit your changes. This will trigger a workflow which will initialize the repository with your values, which should take about two minutes. Simply refresh the page a few times, once you can see the following icons at the top of the readme, it means the initialization was completed:

[![build_failing.png](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/scaled-1680-/firefox-2022-12-05-13-35-57.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/firefox-2022-12-05-13-35-57.png)

The initialization will also trigger the automated build workflows, which may take a few hours to run. Once they have completed, the two icons should turn green, and you should find the compiled binary files available for download for both Windows and Linux in the "Releases" section of the repository.

The build workflows will automatically trigger whenever you push any new commits to the repository and the release binaries will be updated every time. If there are any errors during the build process, the icons will say "failing" again, and you can check the workflow log for more information on what caused the failure.

Once you've set up the repository, you can follow the instructions in the section about [building modules](#bkmrk-building-modules) to add the module to the pragma build.

#### Stable Releases

If your module has reached a state that can be considered "stable", you can publish a stable release. To do so, wait for the regular build workflows to complete, then go to the "Actions" tab of your repository and select the "Create Stable Release" workflow, enter a version number and click "Run workflow":

[![template_module_stable_release.png](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/scaled-1680-/firefox-2022-12-05-14-26-24.png)](https://wiki.pragma-engine.com/uploads/images/gallery/2022-12/firefox-2022-12-05-14-26-24.png)

This workflow should only take a minute, as it just publishes the latest binaries as a new release.

#### Testing

You can find a simple test Lua-script in the "examples" directory of your module. Follow the instructions in the commented section of the script to install and run it to test the module.

#### Advanced Building

If your module requires additional steps (such as downloading and building external dependencies) before it can be built, you can add those steps to the python script in "build\_scripts/setup.py". This script will be executed automatically whenever the Pragma build script is run.

#### Advanced Installation

By default the module binary file will be installed to the "modules" directory of the Pragma installation. If you want to change this behavior, you can do so by editing the "CMakeInstall.txt" file.

<div id="bkmrk--0"></div><div id="bkmrk--4"></div>

# Git Changelog

# PFM (23-03-31)

### Features

- "Base Properties" item in actor editor is now hidden for components that have no base properties ([58ad221](https://github.com/Silverlan/pfm/commit/58ad2210545475b7833c100e324b6f2c5e56f8a0))
- actor bones now show in viewport when hovering over a body part ([254a3c2](https://github.com/Silverlan/pfm/commit/254a3c292b6c3f6c32bcf0e38c56a4479d13e984))
- actor property values are now initialized from project after main component initialization and before entity spawn ([e6d9b8d](https://github.com/Silverlan/pfm/commit/e6d9b8d7a80b0454d23bfdf47ed4e83bf9a33830))
- add "OnChannelAdded" and "OnChannelRemoved" callbacks for animation manager ([3028942](https://github.com/Silverlan/pfm/commit/30289427570ace9138135f089a213930f0ff5425))
- add "Save as Copy" menu bar option ([14219d1](https://github.com/Silverlan/pfm/commit/14219d1f55e827bb3c381d1cd3d3d6175c62614e))
- add additional tooltip information to actor editor constraint icons ([2e721f8](https://github.com/Silverlan/pfm/commit/2e721f8f429f215988547f6090708c682578bc15))
- add additional version information ([c04a956](https://github.com/Silverlan/pfm/commit/c04a9562f5093b0505dabc7e3cdf9ec8196a470a))
- add AnimationManager::FindAnimation for finding/creating the animation of a specific actor ([b500690](https://github.com/Silverlan/pfm/commit/b500690ce37dd39f94c260dd035289c12f80b0db))
- add axis lines to translation gizmo ([19ce11d](https://github.com/Silverlan/pfm/commit/19ce11de4d5adb6fa81b9ab152706fce389fda4d))
- add bloom component action for viewing scene bloom ([a4bc32e](https://github.com/Silverlan/pfm/commit/a4bc32e04e534c0fe8f167bb116186c431ebc670))
- add context menu option to jump to target property for property references in actor editor ([7ffe128](https://github.com/Silverlan/pfm/commit/7ffe128617c1601bd59844def2259c039e23378e))
- add context-menu option for going to driver properties of constraints in actor editor ([75a804a](https://github.com/Silverlan/pfm/commit/75a804ae5ba74e7ffc320ac26ce39f16e0e03fd3))
- add feedback messages when shader kernels are being built ([5f9db8f](https://github.com/Silverlan/pfm/commit/5f9db8ffa2c262ea5b27d8e7030401b9817ae711))
- add film clip context menu options for editing film clip properties ([d2162bb](https://github.com/Silverlan/pfm/commit/d2162bb9313bb5bacd90600e0290b6ac7f7ab5c2))
- add gui.PFMViewport:ScaleSelectedActors ([d84df2a](https://github.com/Silverlan/pfm/commit/d84df2a6f3f7a110d532d3a2867daab49a16341e))
- add hover text for selected bone in viewport ([9674035](https://github.com/Silverlan/pfm/commit/967403565223c472d9c0b86d7bbbf5466aca6c61))
- add interactive skeleton visualization ([235e50c](https://github.com/Silverlan/pfm/commit/235e50c78b61c1ea46a2212efad7fa540fb66f3a))
- add menu option to convert scenebuild of current project to map ([de73ba9](https://github.com/Silverlan/pfm/commit/de73ba9144f1f193afce61951ff6dd4a09cf6f9e))
- add menu option to start lua debugger server ([bd6e21e](https://github.com/Silverlan/pfm/commit/bd6e21ec3bda5b511e12ef29a1565b1fadf537ae))
- add meta type information for transform properties of pfm\_actor component ([23bd079](https://github.com/Silverlan/pfm/commit/23bd079df4358422423d4b963908cc8d6ee91b9f))
- add model explorer option to convert model from/to ascii/binary format ([162f983](https://github.com/Silverlan/pfm/commit/162f983329e3b11aaab709e399dc11d14f9426e2))
- add mouse hover selection outline effect ([8a5754b](https://github.com/Silverlan/pfm/commit/8a5754bc7676bc2b02a80ee626f26954b60fa464))
- add option to create "child\_of" constraint through actor editor ([10d4a8d](https://github.com/Silverlan/pfm/commit/10d4a8dbffea418fb9a4c4a04a48b289c16961df))
- add option to remove drivers and constraints via icon in actor editor ([4bebe88](https://github.com/Silverlan/pfm/commit/4bebe8830ef8a9976e53cb158003105d9e156e36))
- add outline effect component ([3ea6fe5](https://github.com/Silverlan/pfm/commit/3ea6fe53ed2083aa4afaaff4b65cd444a5a7ffbb))
- add PFMTreeViewElement:AddUniqueIcon and :ClearIcons ([70bcef9](https://github.com/Silverlan/pfm/commit/70bcef955dad5374fc6b436e923c0120511c70a9))
- add saving / loading to ik rig editor ([7348c27](https://github.com/Silverlan/pfm/commit/7348c27dee38690dcca82faa7dfa1eda65662966))
- add support for property reference component property types ([49805d2](https://github.com/Silverlan/pfm/commit/49805d2a20ec79c872bb12c3143a379c15a5187b))
- add support for read-only component properties in actor editor ([1456594](https://github.com/Silverlan/pfm/commit/1456594df50c38a51b691e866fe814dc38820fb3))
- add support for very large render resolutions ([0ea820c](https://github.com/Silverlan/pfm/commit/0ea820caf1f76a0423ec78dfd062c0293417a1b6))
- add tiled rendering for pragma renderer ([0f19281](https://github.com/Silverlan/pfm/commit/0f192816300a59268837cd5b519a2742f75fb13e))
- add tutorial system ([a35ca15](https://github.com/Silverlan/pfm/commit/a35ca1567e321da5019a1b4d041539a733c17407))
- add update-checker ([8d965e4](https://github.com/Silverlan/pfm/commit/8d965e48d58012ff25f9f9df82d2982312d497fc))
- add utility functions and identifiers for tutorial system ([6030ef5](https://github.com/Silverlan/pfm/commit/6030ef59e2e1a80976f866bb87535e6838a5d5a2))
- add vr\_manager component (wip) ([b411791](https://github.com/Silverlan/pfm/commit/b411791c00e5bf69908b1b826dd698506dab69ad))
- add world axis gizmo ([52ba356](https://github.com/Silverlan/pfm/commit/52ba356f3983f7b905c76b9ec7edb41a6417f178))
- adding a constraint or math expression now automatically adds a single-value animation channel if one doesn't exist ([c44eadc](https://github.com/Silverlan/pfm/commit/c44eadc0aaa9521b4717a91dff79c2822e5930df))
- all logging categories are now enabled by default if log parameter is not specified ([ba01a4d](https://github.com/Silverlan/pfm/commit/ba01a4d47093e57526c36c1d22b8744e189d6597))
- animation drivers can now be created through actor editor ([eb05de4](https://github.com/Silverlan/pfm/commit/eb05de4ecab1da4521ea185dd643f8790182b4ae))
- **anim:** bones can now be selected by clicking a triangle weighted to that bone ([1416fbb](https://github.com/Silverlan/pfm/commit/1416fbbed42157f005ab5798a1a1eabe720cfb7f))
- **anim:** non-selected IK bones can now be directly clicked and moved in viewport ([ea6f8d5](https://github.com/Silverlan/pfm/commit/ea6f8d59671e6cd7555e9e60b8f6cd67acf8c6e5))
- **anim:** selected bones are now highlighted ([b465641](https://github.com/Silverlan/pfm/commit/b4656417ea1a704b001b0fa2b1f3f6a39ee161f9))
- apply changes for Silverlan/pragma@e6e7bb59 ([ab4cfcd](https://github.com/Silverlan/pfm/commit/ab4cfcd82e36c3e51b533853be68897708ded81d))
- **asset,gui:** add missing gui material files for detaching windows ([a353b92](https://github.com/Silverlan/pfm/commit/a353b929023c795dec7e20e5c1d79d1d86e0aab5))
- bones in actor editor are now displayed in hierarchical order ([ca59b1c](https://github.com/Silverlan/pfm/commit/ca59b1c1488287610fc6641f08366ab60f3e2d29))
- camera settings are now saved and restored to/from projects ([132c05d](https://github.com/Silverlan/pfm/commit/132c05d18897316b4ab53c2e0b16d3130c122f44))
- change implementation of util\_transform component to allow usage in secondary scenes/viewports ([df35060](https://github.com/Silverlan/pfm/commit/df35060083b1af5b07ad31d2faf3f6a9674e5a31))
- component lists in actor editor now use localized component names ([569e80c](https://github.com/Silverlan/pfm/commit/569e80ccb27a179c392caf8c9d732cbde3005c1d))
- component properties with a single animation value can now be edited directly outside of graph editor ([caca401](https://github.com/Silverlan/pfm/commit/caca401e4d565ba5b1390d4944a3b74fedb03250))
- components in actor editor are now listed directly below actors instead of "components" sub-item ([703fa63](https://github.com/Silverlan/pfm/commit/703fa6374079d8584179835acea9769446cb50b8))
- converting map to actors now takes scale into account ([e0e5d9a](https://github.com/Silverlan/pfm/commit/e0e5d9a5297579f1fefae8172c680691af90a736))
- copying the property path of a property now includes the full path including actor id ([d41ff17](https://github.com/Silverlan/pfm/commit/d41ff17caf3a8008db2de8548bc25907457c6e42))
- current project file name is now displayed in window title bar ([363e53d](https://github.com/Silverlan/pfm/commit/363e53d869e2711b3f9b1990754c1cce1674a730))
- **dev:** add option to assign actor component to x / y variable via right-click context menu in actor editor if developer mode is enabled ([3a22890](https://github.com/Silverlan/pfm/commit/3a228904ec23e503329538f15bf6b165bdb24e68))
- disable bloom for transform gizmos ([58e4438](https://github.com/Silverlan/pfm/commit/58e443849ad371ff551e9e934b62e144de58a879))
- disable motion editor button ([3e8f00f](https://github.com/Silverlan/pfm/commit/3e8f00f2461cca1d2bd746717453d2f8fe727895))
- **ecs:** add option to specify ik rig from file for ik\_solver component ([ad57536](https://github.com/Silverlan/pfm/commit/ad575364895e811ed01eadda3a01125cdcd16599))
- **ecs:** add pfm\_project\_manager component for creating PFM scenes outside of PFM ([f43f679](https://github.com/Silverlan/pfm/commit/f43f6797ae9cd9e12d0a1bee72fe1bc421b4e100))
- **ecs:** remove ik\_solver component ([5f7fc65](https://github.com/Silverlan/pfm/commit/5f7fc65be0eb80299cf790e6ebb11a28fe413700))
- emission\_factor for cycles pbr shader can now be used without emission texture ([3e156cd](https://github.com/Silverlan/pfm/commit/3e156cda000a3d3715a984c2b59337a7985eec51))
- enum-based component properties no longer list "Count" as an option in actor editor ([6f9f12f](https://github.com/Silverlan/pfm/commit/6f9f12fd13675c0d069c8756fc6f002a3cfd637d))
- **gui:** add ik rig editor ([8d5dffc](https://github.com/Silverlan/pfm/commit/8d5dffcc7988f8fed474ee17fb3e586bfd58c850))
- **gui:** add option to add simple non-editable text properties to control menues ([6c1c3e5](https://github.com/Silverlan/pfm/commit/6c1c3e524bccb9a07c6a8d581608af200cf14a48))
- hide render options not supported by selected renderer ([2edcc14](https://github.com/Silverlan/pfm/commit/2edcc1463c1df998d4c328decab4084ca6941560))
- ik rig editor updates and improvements ([0b92277](https://github.com/Silverlan/pfm/commit/0b92277b1e5c28865419e3ac3cba3ff624884b91))
- **ik:** add ik components (wip) ([a63e07f](https://github.com/Silverlan/pfm/commit/a63e07f1bbfc14aa8f2f5077009cf5c844373d6a))
- **ik:** increase precision of ik solver ([90d4081](https://github.com/Silverlan/pfm/commit/90d40813c5e377047d3b0c1d84e12d505a52d458))
- implement changes for Silverlan/pragma@0c91c31c ([4668b27](https://github.com/Silverlan/pfm/commit/4668b279286efbb4cb23d0621e32198109f33a99))
- importing asset into model explorer now gives an option to import as collection or as single model ([55b0565](https://github.com/Silverlan/pfm/commit/55b05659be75dc6ef1b3cb7cb81eb94802b0f4a7))
- importing assets via model explorer now imports into sub-directory ([e32e3ee](https://github.com/Silverlan/pfm/commit/e32e3ee119aed45175d6440bb3f2b7f121abdd18))
- improve skeletal bone visualization in viewport ([0315c90](https://github.com/Silverlan/pfm/commit/0315c90bc20108758f6457d69cc37a770b5d0bc4))
- **locale:** add ik rig editor localizations ([758c199](https://github.com/Silverlan/pfm/commit/758c199f3048d45636b7346cd120fde57cdb989a))
- **locale:** add Japanese translation ([2c9fa7b](https://github.com/Silverlan/pfm/commit/2c9fa7b0f4b4b613e24bbd191b3ea55a6d966088))
- **locale:** add localization for components and component properties in actor editor ([cfc0579](https://github.com/Silverlan/pfm/commit/cfc0579a425152f774b3988d4732e9bcaf9222c9))
- **locale:** add missing localizations ([9115eec](https://github.com/Silverlan/pfm/commit/9115eec3942e096ac46e1e44563d146c29aeb74d))
- **locale:** add missing localizations ([a464a92](https://github.com/Silverlan/pfm/commit/a464a92d2fbee5a3e510bdcd2dc7c440f28d26b4))
- **locale:** update localizations ([dfde1a8](https://github.com/Silverlan/pfm/commit/dfde1a82fc88f9569dd41ad32a8ed2692760cccf))
- math expression window now gives immediate feedback about validity of expression ([88cfd5d](https://github.com/Silverlan/pfm/commit/88cfd5dfb99c94862924c87cd10d51f5c6c12d78))
- model browser now automatically refreshes after importing assets ([9de100f](https://github.com/Silverlan/pfm/commit/9de100fa85652638f5d9a59b98b883bbaac936cc))
- moving actor between collections is now instantaneous ([50c2ff8](https://github.com/Silverlan/pfm/commit/50c2ff880f4da7bf17fd7aa2f062f2de11733029))
- PFM projects can now be marked as read-only ([0e423a5](https://github.com/Silverlan/pfm/commit/0e423a5533b111757de9a93593f821d69177ba96))
- pfm projects can now be saved/loaded in ascii format ([4647fc2](https://github.com/Silverlan/pfm/commit/4647fc2027b9829f4ecf3bb2fcce76ab979d2d81))
- pfm\_actor component now also adds origin component ([a6793d8](https://github.com/Silverlan/pfm/commit/a6793d8c2d4750c7b26d38999f9de558496bb942))
- placing an actor through the model catalog now assigns the model name to the actor's name ([f71b3f3](https://github.com/Silverlan/pfm/commit/f71b3f3c969b5419cafb64a28f6c49b900b31496))
- properties in actor editor now only display the base name of the property instead of the full name ([d31eb26](https://github.com/Silverlan/pfm/commit/d31eb2617e4517aa92d300ed9a2f6142bc4e43f1))
- remove origin component from pfm\_actor component ([e8f2679](https://github.com/Silverlan/pfm/commit/e8f26794b3ed743cfd235448ed2de7fe3b658d34))
- rename "track\_to" constraint to "look\_at" (see Silverlan/pragma@da75b3f6 ) ([aab83b5](https://github.com/Silverlan/pfm/commit/aab83b57dad97c85cc8ca6b70e065eba8f3040e3))
- replace selection wireframe with outline effect ([d0fb7f5](https://github.com/Silverlan/pfm/commit/d0fb7f5b977f6354a08d4feaa19deec3f3afb2c4))
- selecting an actor in the viewport now automatically scrolls to it in the actor editor ([c5e5363](https://github.com/Silverlan/pfm/commit/c5e53636f0d61eee87a9ee9efc81554da9303cf9))
- sfm projects can now be imported from directories other than "elements/sessions/" ([f41b93c](https://github.com/Silverlan/pfm/commit/f41b93cb14565e2f4030e27f43d0068d641fedb4))
- **shaders:** add missing particle shader files ([d786f7e](https://github.com/Silverlan/pfm/commit/d786f7e8c6410c61d9e756ddc13337a0a3ab665f))
- tutorial layout changes ([7c4e058](https://github.com/Silverlan/pfm/commit/7c4e0584d9b37ee27774ed2209968c09f342d6b6))
- UDM editor now has options for creating new UDM files, importing UDM data or saving as new file ([1789cce](https://github.com/Silverlan/pfm/commit/1789cce1a907bf846644ae661d4f863de106c8e1))
- various actor editor additions ([74ac3b7](https://github.com/Silverlan/pfm/commit/74ac3b776bce7111fab2f8e6b4337575a07a5257))
- various ik rig editor additions and improvements ([3019232](https://github.com/Silverlan/pfm/commit/30192328be42884d41964d150cb7c9d9aed6bab7))
- various tutorial system improvements ([c0c97e9](https://github.com/Silverlan/pfm/commit/c0c97e99d23e82252664c48a8a3e00a655c2f46e))
- version info can now be clicked to copy it to clipboard ([1ad002f](https://github.com/Silverlan/pfm/commit/1ad002f6b8dc09e5c22327184e36bce30b51fe06))
- **vr:** vr manager now automatically creates actors for all recognized tracked devices ([1add829](https://github.com/Silverlan/pfm/commit/1add829ab8b8c379581806e56c6a7550504aff65))

### Bug Fixes

- add missing include ([2d00d50](https://github.com/Silverlan/pfm/commit/2d00d508de110aa8feca80df1ff237ea402b2f59))
- constraint menu no longer shows up for string-based properties ([73fcbc5](https://github.com/Silverlan/pfm/commit/73fcbc5a01876525d8c40421c4f96e2bde76cb02))
- debug objects are now longer included in renders when using Pragma renderer ([edbdf52](https://github.com/Silverlan/pfm/commit/edbdf520b1b78c81f7f0a4135afd9a409de4295b))
- fix "Save As" not updating internal file name to new file name ([e529ab0](https://github.com/Silverlan/pfm/commit/e529ab0f96fa4587dbd7a5c09f7889a3cd63c36a))
- fix ascii-based models not appearing in model explorer ([fda5dcd](https://github.com/Silverlan/pfm/commit/fda5dcd1460baa8ce9afff24f50d0d1453e9c5d9))
- fix clicking mesh not detecting correct weighted bone properly ([864004e](https://github.com/Silverlan/pfm/commit/864004e65ff9473ffa818f8b2750dcbc2e191816))
- fix component property values of type 'entity' not getting saved/loaded properly to/from a PFM project ([68ca36c](https://github.com/Silverlan/pfm/commit/68ca36c9902d8664b94f3275d0474a2589103e9a))
- fix device type settings in render options being inverted ([fc4f53d](https://github.com/Silverlan/pfm/commit/fc4f53d04638808371a30e29b800e3d60c6b50d1))
- fix gui.PFMTreeViewElement:SetIdentifier not registering identifier with parent ([3f18518](https://github.com/Silverlan/pfm/commit/3f18518b0a59df2f0ca25cc1f17e406b8d28caa0))
- fix importing map not importing prop\_dynamic entities ([a446d9c](https://github.com/Silverlan/pfm/commit/a446d9ccd1f06170185c7a40b6092296ec7dabe6))
- fix incorrect class name for pfm\_project\_manager component ([1dfd98c](https://github.com/Silverlan/pfm/commit/1dfd98cfca2750861832a1b2a5a9b486c41940b8))
- fix light sources not showing up in secondary viewports ([8118eb8](https://github.com/Silverlan/pfm/commit/8118eb8027afd52096c1fde1f8620ff9c01a2035))
- fix low-resolution preview render image ([c0f888d](https://github.com/Silverlan/pfm/commit/c0f888dd2282226f0312f7f9123f7a72eeb665d4))
- fix lua error when auto-saving ([0e818e4](https://github.com/Silverlan/pfm/commit/0e818e442e76dadf98480b99864595d8331e772e))
- fix lua error when baking lightmaps ([84a714c](https://github.com/Silverlan/pfm/commit/84a714c7cfe63196f0a3dbfa0d05567854aa6abb))
- fix lua error when changing component property values ([1b55a9f](https://github.com/Silverlan/pfm/commit/1b55a9fa76934973908f3390a0ae1d3a03ccf68b))
- fix lua error when changing property values ([7d7492a](https://github.com/Silverlan/pfm/commit/7d7492a0d21ec9ac88d92e01a259f6e94ffddaf4))
- fix lua error when clicking ik handle in viewport ([25c38e2](https://github.com/Silverlan/pfm/commit/25c38e2b4e5a64e4d8dad6cc7b41b1f34d5de083))
- fix Lua error when launching PFM ([5baf87d](https://github.com/Silverlan/pfm/commit/5baf87da06d7f3a33f6b8674dc9b86d65ca08502))
- fix Lua error when moving actor to empty collection ([b71a946](https://github.com/Silverlan/pfm/commit/b71a9463145365eaaeb029b83ecd6df927531ab6))
- fix lua error when rendering if opencv module is not installed ([ab71e1e](https://github.com/Silverlan/pfm/commit/ab71e1ee3a84e9ef528faac82c5edf8a8216bbe1))
- fix lua errors ([8bec2e8](https://github.com/Silverlan/pfm/commit/8bec2e8936562dc0a216ce914eaca3b25ea67496))
- fix lua errors if actor is spawned with unknown component types ([8bf3ff3](https://github.com/Silverlan/pfm/commit/8bf3ff39e0465aac40ada0c631fd941cc2818c0f))
- fix Lua errors in ik rig editor ([deb7eb2](https://github.com/Silverlan/pfm/commit/deb7eb2031a3768121dbc1b8a7bdcfb10417f21a))
- fix lua errors when adding or removing constraints ([70dddfe](https://github.com/Silverlan/pfm/commit/70dddfe1f4541d4f05307a9dbaf9993956944c76))
- fix potential crash when selecting or de-selecting spot-light actor ([a3bc308](https://github.com/Silverlan/pfm/commit/a3bc3081ac45e6b6a03b785510ad198fcdf4698a))
- fix quick-ik in actor editor not working properly ([68a190b](https://github.com/Silverlan/pfm/commit/68a190b36c69fc42675035a2eec937af2d14be69))
- fix removing pfm\_skeleton component not removing visual bones ([3ceb0c9](https://github.com/Silverlan/pfm/commit/3ceb0c992c34595c8edbf792858b545d831d3fb3))
- fix some items in actor editor tree having incorrect identifier assigned to them ([1288805](https://github.com/Silverlan/pfm/commit/128880529505408d2e8f7bbf45ecf32561ab228b))
- **ik:** fix broken ik behavior for actors without the pfm\_model component ([8ed45f6](https://github.com/Silverlan/pfm/commit/8ed45f6ccfaac4eaa5756ad0393f0e5eed627d31))
- **locale:** fix changing language not being saved ([e997b2d](https://github.com/Silverlan/pfm/commit/e997b2d85fadb758af6ed3decc15876ec7b9ceae))
- resolve issue where actor editor component icons would disappear in some cases ([f2bd880](https://github.com/Silverlan/pfm/commit/f2bd880ad9e5a95771fea296c6f8d84dfab808fb))
- resolve issue where actor editor component property list would not get reloaded when component properties change ([a81095c](https://github.com/Silverlan/pfm/commit/a81095c1b2a8f2a9ea5462c41212c7247090e841))
- resolve issue where camera projection matrix would not be reset properly after tiled rendering ([aebe5c8](https://github.com/Silverlan/pfm/commit/aebe5c8b758f939219e93ca3abb3104149413826))
- resolve issue where clicking constraint icon in actor editor would not select associated property properly ([1226112](https://github.com/Silverlan/pfm/commit/1226112faa767c1bf4729a594b37f73d12a0b7b7))
- resolve issue where incorrect slider step size would be used for slider UI elements ([988bea9](https://github.com/Silverlan/pfm/commit/988bea991a24ee0bf92de0c37cba177a7d3dcccf))
- resolve issue where removing an actor could result in corrupted actor references ([6f9ad31](https://github.com/Silverlan/pfm/commit/6f9ad31705ef398e05fa3defd2af317c3063de06))
- resolve issue where sky actor would appear with error texture ([5ba11fc](https://github.com/Silverlan/pfm/commit/5ba11fc1583504d897ecfb7012943500148cdc09))
- resolve issue where transform gizmo arrows would not transform in correct space ([41b7ee3](https://github.com/Silverlan/pfm/commit/41b7ee3e80e2523c9f38e40280767047f2b6be0f))
- resolve issue with actor model being initialized too late, causing dependent component property values to not be initialized properly ([fa03294](https://github.com/Silverlan/pfm/commit/fa032941da0b6d9732a0db589fb4d0119e44bca9))
- resolve various issues caused by filmmaker being initialized before game is ready ([d690b82](https://github.com/Silverlan/pfm/commit/d690b829a1e5708a155cf83955f8e71a059da5fd))
- resolve various issues related to transform gizmo ([1667afe](https://github.com/Silverlan/pfm/commit/1667afebff61db330765727ede151036c5e6634c))

#  

# Pragma (23-03-31)

### Features

- "scale" keyvalue for prop and transform components now accepts vector values ([755e0cd](https://github.com/Silverlan/pragma/commit/755e0cdc62f8b656fc3d56ba57e4fcce95c335a1))
- add additional error reporting if model loading or importing fails ([e0853ac](https://github.com/Silverlan/pragma/commit/e0853aca28863eabeb6a5e19a7fa50fcdd9bf614))
- add base editor UI element identifiers ([2fc6c4d](https://github.com/Silverlan/pragma/commit/2fc6c4d4d7e518188df90a03a3ecb95840ce8b03))
- add bloom component properties ([56042d1](https://github.com/Silverlan/pragma/commit/56042d1c47e2131a665d0878400ed195c3f43f48))
- add console commands log\_level\_console and log\_level\_file for changing log levels on the fly ([8a6becd](https://github.com/Silverlan/pragma/commit/8a6becd9b60831894a68325385d841518d78b2f7))
- add error handling when saving a model ([cd7524d](https://github.com/Silverlan/pragma/commit/cd7524dea1920137915d87558fc5e661f101c745))
- add functions for getting parent pose of transform-based component properties ([e4c108b](https://github.com/Silverlan/pragma/commit/e4c108b03efd31d0e2c20291e5c877fdb015017c))
- add git sha to version information ([7b34f3c](https://github.com/Silverlan/pragma/commit/7b34f3cdf209b8da2126c1fb7baa4c80f06d67cf))
- add global string table ([6f67c6a](https://github.com/Silverlan/pragma/commit/6f67c6af55a60875e97a88e16ab519c2a32cace8))
- add gltf import support for multiple mesh instantiations ([b70ee2a](https://github.com/Silverlan/pragma/commit/b70ee2a540140da534ca9f799e33b4d853371534))
- add gui.WIBaseEditor:GetContentsElement ([31c18be](https://github.com/Silverlan/pragma/commit/31c18be4a5655e6d1142def0c7d6dc3940744a39))
- add logging messages for lightmap system ([6d7813e](https://github.com/Silverlan/pragma/commit/6d7813e31a654e7fe91fcbe70de64406cb5f3eed))
- add missing log\_file launch parameter ([15c0e4c](https://github.com/Silverlan/pragma/commit/15c0e4c12e16ae8b721b896e13832c5ee8714ee2))
- add model flag for indicating if model is world geometry ([75930c4](https://github.com/Silverlan/pragma/commit/75930c4c53f8182c83eee7d4d4317c6dc30500ac))
- add Model::RemoveUnusedMaterialReferences ([91bfd95](https://github.com/Silverlan/pragma/commit/91bfd9530f9014b859c73a8bde53e61c33667196))
- add new logging system ([7d8c965](https://github.com/Silverlan/pragma/commit/7d8c965c32916dc0d68261ddd810ce8e34c10e37))
- add on-complete callback to util.import\_assets ([1ab7ffd](https://github.com/Silverlan/pragma/commit/1ab7ffd07ea4ee1718c94fa617cb1aa1ac17b994))
- add option to calculate projection matrix for tiled rendering ([d862e63](https://github.com/Silverlan/pragma/commit/d862e63ceba388dfbb2786c816c0c6b7e510f6a0))
- add ostream overloads for entity reference types ([10554e5](https://github.com/Silverlan/pragma/commit/10554e57ce41c17deb119ea591feeec198df6a89))
- add support for importing gltf scene as map with multiple models ([802061e](https://github.com/Silverlan/pragma/commit/802061e37e04105104b0b8800e742a035015949f))
- add support for Lua development and debugging with Visual Studio Code ([405dabf](https://github.com/Silverlan/pragma/commit/405dabfc66a40774f3c539d26a7a54fb1a48b43b))
- add udm lua bindings ([b66c082](https://github.com/Silverlan/pragma/commit/b66c08250136e3598b97c7d1c367f387cb8fd1d5))
- add udm.BaseSchemaType:ReloadUdmData ([43357c3](https://github.com/Silverlan/pragma/commit/43357c3b978880ec7e1bb9d301624b3f7d02861c))
- add util::generate\_two\_pass\_gaussian\_blur\_coefficients ([f1c9c92](https://github.com/Silverlan/pragma/commit/f1c9c9274a04e40bb52e535b4cd472554fb8cb8e))
- add util::to\_image\_buffer overload for providing a pre-existing staging image ([00397a6](https://github.com/Silverlan/pragma/commit/00397a6104fcd116ceefd1a9cdc70b250a517ece))
- add WorldData Lua bindings ([68eaa49](https://github.com/Silverlan/pragma/commit/68eaa496140d2b33caed8a19169c216d2d1ae654))
- **anim:** add multi-threading for animations ([36029e2](https://github.com/Silverlan/pragma/commit/36029e26e3dfe69f46328a74de0bed3165d1dc39))
- **anim:** implement constraint influences ([ec65ae4](https://github.com/Silverlan/pragma/commit/ec65ae4643eb3588826c51624b0b5939e8ea3759))
- **asset:** add skybox materials ([11fa969](https://github.com/Silverlan/pragma/commit/11fa969159395ee2a76b78b93763001da0122208))
- **asset:** replace toolsnodraw texture ([3b18acc](https://github.com/Silverlan/pragma/commit/3b18acc983cd61388927d3d732b9e761a05fceb2))
- code cleanup ([e4ad13f](https://github.com/Silverlan/pragma/commit/e4ad13ffecb63a1078e7e6c6926214edbac35b78))
- debug\_aim\_info command now attempts bhv raycast before physics raycast ([6c27acb](https://github.com/Silverlan/pragma/commit/6c27acb25e8784141056f89cca70b657e30581ac))
- **debug:** add info.txt to crashdump ([955642d](https://github.com/Silverlan/pragma/commit/955642dae56ea351653e7b73d872ad74b6ed7e87))
- **debug:** add logging information ([74977af](https://github.com/Silverlan/pragma/commit/74977afa94b3ec4addb04717ce586f88878b1343))
- **debug:** crash dump now includes vendor information about all available GPUs on system ([772db85](https://github.com/Silverlan/pragma/commit/772db85aa0dc3fbda1654d729863f9496463bbc9))
- **debug:** crashdump now includes device id for available GPU devices ([44fde2e](https://github.com/Silverlan/pragma/commit/44fde2e512382ec3c5d6e44a233529f73c45c62e))
- **debug:** re-enable crashdump exception information ([b49bdaf](https://github.com/Silverlan/pragma/commit/b49bdaf05eb11af6e8cc1bef3d544ba6b372bafd))
- **ecs,animation:** add animation constraint system ([e628639](https://github.com/Silverlan/pragma/commit/e628639d75a039b2416eee05e657d99af3dbbeb0))
- **ecs,lua:** add option to specify type meta data as well as custom setters and getters for Lua-based component properties ([8222143](https://github.com/Silverlan/pragma/commit/8222143ab2c036cce6076323888d13d57d656b8b))
- **ecs,lua:** lua-based component properties using the PoseTypeMetaData type meta data are now automatically associated with respective pos/rot/scale properties ([0c91c31](https://github.com/Silverlan/pragma/commit/0c91c31cbc6992b40324eeb369c0e4bb1e8cd82c))
- **ecs:** add "pose" property to ik solver component ([07b37ee](https://github.com/Silverlan/pragma/commit/07b37ee1947f66699b40da68cf6a784c30332671))
- **ecs:** add BaseBVHComponent::GetVertex ([a62a322](https://github.com/Silverlan/pragma/commit/a62a32269cd588ab68a43c8faac5f2ff26ee78b8))
- **ecs:** add child\_of constraint component ([679f76e](https://github.com/Silverlan/pragma/commit/679f76ed76ed742f0c9c163ac54da2afac0e2a4d))
- **ecs:** add component property meta type data ([fed2d66](https://github.com/Silverlan/pragma/commit/fed2d66077fcc574071f1636850abaaca28e265d))
- **ecs:** add component property parent meta type ([2d8f34f](https://github.com/Silverlan/pragma/commit/2d8f34fc3246f539e3c92d8532fb153a3aa7e5ad))
- **ecs:** add constraint component events when driver or driven object has changed ([88301a7](https://github.com/Silverlan/pragma/commit/88301a75ff93896ad13c9883e9bdf05b664fee86))
- **ecs:** add constraint entity component types ([1410021](https://github.com/Silverlan/pragma/commit/141002142b9955c3db25c06d217b7050b6e3c116))
- **ecs:** add event callback when clearing material overrides for model component ([904fa93](https://github.com/Silverlan/pragma/commit/904fa93967da22e0917c49fff9b386126aaf0968))
- **ecs:** add ik\_solver component ([a69e632](https://github.com/Silverlan/pragma/commit/a69e632920fcce70c84372424bfa9a8e653ec2ac))
- **ecs:** add methods for retrieving coordinate-based component properties in specific coordinate space ([b26c539](https://github.com/Silverlan/pragma/commit/b26c539d534c251b8038a325c6b71f5e4fa20fcf))
- **ecs:** add origin entity component ([e9b5029](https://github.com/Silverlan/pragma/commit/e9b50296e0daf6b26a415c01eb36a7d1467c5cd0))
- **ecs:** add pose type meta data for associated pose properties with pos/rot/scale properties ([8b24818](https://github.com/Silverlan/pragma/commit/8b24818ca7b9e45f24784250c601f1ca5bca2b3e))
- **ecs:** add property component member type ([5bde6fc](https://github.com/Silverlan/pragma/commit/5bde6fc1c40ba1c1776ad3853b7a8cd786ed18cc))
- **ecs:** add read-only member property flag ([a08a204](https://github.com/Silverlan/pragma/commit/a08a204ab8899cf9ec1524d8fe074e17d3193ca9))
- **ecs:** add track\_to constraint component ([06001d5](https://github.com/Silverlan/pragma/commit/06001d5f6e788cef01235d3eb0385afcb3b9e968))
- **ecs:** BaseGenericComponent::EVENT\_ON\_MEMBERS\_CHANGED now includes event data struct with component information ([23f75d9](https://github.com/Silverlan/pragma/commit/23f75d9824397bb9b6a6af693cd34bce30c63341))
- **ecs:** implement constraints: limit\_location, limit\_rotation, limit\_scale ([34a3b26](https://github.com/Silverlan/pragma/commit/34a3b26c460ee11731215b0a08b7afd92ee92336))
- **ecs:** improve performance of composite component ([08aaacb](https://github.com/Silverlan/pragma/commit/08aaacbaaaaa4a46a076928ea631af6e538e6d17))
- **ecs:** rework and rename track\_to constraint to look\_at constraint ([da75b3f](https://github.com/Silverlan/pragma/commit/da75b3f69f0043e6d8d70fb04bd332d7a05028a7))
- emission\_factor material property can now be used without emission map ([39fa66c](https://github.com/Silverlan/pragma/commit/39fa66cd8acafd289e5a196b90a0c0c14fc2af82))
- Engine::AddTickEvent is now thread-safe ([c00bd5d](https://github.com/Silverlan/pragma/commit/c00bd5d06f0629f2b4169c8426d0205166ed47eb))
- entity model bodygroups are no longer reset on spawn ([16c1177](https://github.com/Silverlan/pragma/commit/16c1177cc7967ca6be7d1e464da46978325561b5))
- **ExprTk:** update to version 0.0.2 ([e354bb2](https://github.com/Silverlan/pragma/commit/e354bb2a67deb4e1e3bb7559d9694c7c8d5c015a))
- force panima animations to always update, even if timestamp hasn't changed ([6f23fb2](https://github.com/Silverlan/pragma/commit/6f23fb2451196b743f4c03a0191259db585b0686))
- **gui,lua:** add gui.ScrollContainer:GetWrapperElement, :ScrollToElement\* functions ([4156f14](https://github.com/Silverlan/pragma/commit/4156f14ac3c063556ba6e73ea8335393b3e904a6))
- **gui:** add option to disable automatic rendering when setting scene for WIViewport GUI element ([21c9131](https://github.com/Silverlan/pragma/commit/21c913194b99fd735909459117b23b6773af5da7))
- **gui:** add option to disable menu item ([489659b](https://github.com/Silverlan/pragma/commit/489659b487d25abec0b3f5de1ae305b51dcfac10))
- **ik:** add full-body ik system ([8455946](https://github.com/Silverlan/pragma/commit/84559461a521fbcdcdbf2f3619150d7981a4b0d7))
- improve bloom effect ([17c4e54](https://github.com/Silverlan/pragma/commit/17c4e54470b17fd77a339f3becc4cf48f27e7619))
- improve lightmap quality ([1cfd4d2](https://github.com/Silverlan/pragma/commit/1cfd4d23e9889e6cecfadc6795ac959864c82b3f))
- **lad:** add math alias definitions to meta lua documentation ([810844b](https://github.com/Silverlan/pragma/commit/810844bd35257f5bb4fbaa73c067d5e62ed6b902))
- **lad:** add math alias definitions to meta lua documentation ([fd4b7b5](https://github.com/Silverlan/pragma/commit/fd4b7b576950220907b1794df62aace5d5a1f14a))
- **lad:** update lua meta documentation files ([d1326d9](https://github.com/Silverlan/pragma/commit/d1326d919e6101293a199398f768d4d0b64b3c0f))
- lightmap data cache component now initializes data cache automatically ([6bdbe84](https://github.com/Silverlan/pragma/commit/6bdbe84c98eae9544fd22a8da87ac718ddd0f525))
- **locale:** add debug logging messages ([bd52a4a](https://github.com/Silverlan/pragma/commit/bd52a4a2df8e628e8a73051db56b6bd81cd9549c))
- **locale:** add Japanese translation ([ee424f3](https://github.com/Silverlan/pragma/commit/ee424f35c2792bac4d279cca46722934c89df45b))
- **locale:** add localization for components and component properties ([b6b1d40](https://github.com/Silverlan/pragma/commit/b6b1d40e1e02bab17b314ca47d1bed2a9ef04ef4))
- **locale:** update localizations ([31767f6](https://github.com/Silverlan/pragma/commit/31767f6ec0416537a10491380e8e8867a728a3ed))
- log system improvements ([79a12ff](https://github.com/Silverlan/pragma/commit/79a12ffd3175cc0fa7db38264ffbf0410eea3c48))
- loggers are now flushed whenever error or critical messages are printed ([6cfcb81](https://github.com/Silverlan/pragma/commit/6cfcb8183aa9addd61b7b3bf11d018592036810a))
- **log:** info messages now have the "\[info\]" prefix if printed using the logging system ([9113847](https://github.com/Silverlan/pragma/commit/91138471be3dbfd3a15bf46fbbc4fe92e51933ed))
- **log:** warning, error and critical messages are now completely colored in ([baede6a](https://github.com/Silverlan/pragma/commit/baede6af8371c2c9e76900b2838e5c82fe3e230d))
- lua-based shaders no longer re-initialize material descriptor set when it is not necessary to do so ([c199a10](https://github.com/Silverlan/pragma/commit/c199a10e12abdb47972d6047173177e57ea55c94))
- **lua,ecs:** add component property reference bindings ([228dab7](https://github.com/Silverlan/pragma/commit/228dab7638706b78cb9bd18c89564a45734b8626))
- **lua:** add console.invoke\_change\_callbacks binding ([c568ec2](https://github.com/Silverlan/pragma/commit/c568ec25002439781d25de480f757c7b37edbea5))
- **lua:** add constraint function bindings ([727389f](https://github.com/Silverlan/pragma/commit/727389fa68a8970a0281cefc0a10abd953a85473))
- **lua:** add ents.AnimatedBvhComponent:RebuildAnimatedBvh binding ([dc377f4](https://github.com/Silverlan/pragma/commit/dc377f44f20dd76287599fb300ea6e34c20cea06))
- **lua:** add ents.AnimatedComponent:GetEffectiveBoneTransforms binding ([d53c570](https://github.com/Silverlan/pragma/commit/d53c5704f6b378a6baa9f43e5f84e9acd0fd312e))
- **lua:** add ents.EntityComponent:InvokeElementMemberChangeCallback binding ([6af95ce](https://github.com/Silverlan/pragma/commit/6af95cee76d4b782d2c1ec28b1edca36818b0f89))
- **lua:** add ents.is\_member\_type\_animatable binding ([51a2271](https://github.com/Silverlan/pragma/commit/51a22717f732d66e7419c278c5c3a1d6e1e167c4))
- **lua:** add ents.parse\_uri and ents.create\_uri bindings ([d69df6f](https://github.com/Silverlan/pragma/commit/d69df6fdbaac7352ee6f9a42a7e1631f8343af8e))
- **lua:** add equality operator for prosper.Window objects ([3365a0a](https://github.com/Silverlan/pragma/commit/3365a0a4871501457ee042fc608f2684ae6ffbf0))
- **lua:** add game.is\_game\_initialized, game.is\_game\_ready, game.is\_map\_initialized ([f3744d7](https://github.com/Silverlan/pragma/commit/f3744d767213ef9ab13a35badb31c09a829303e9))
- **lua:** add gui.get\_element\_under\_cursor overload with base element parameter ([2589c61](https://github.com/Silverlan/pragma/commit/2589c61af18c763d2d404b58c26a24d1fbc04502))
- **lua:** add ik rig lua bindings ([5b7735d](https://github.com/Silverlan/pragma/commit/5b7735d95fda29347a8bb3fc0fbf14397d6f2f27))
- **lua:** add Lua bindings for log library ([c536f87](https://github.com/Silverlan/pragma/commit/c536f874745cf6672c27683331e17b5417f4c0b3))
- **lua:** add math.Transform constructor with ScaledTransform argument ([c3ef7ed](https://github.com/Silverlan/pragma/commit/c3ef7ed88ec1774c921ef879311badfebf3ef089))
- **lua:** add missing entity component type meta data bindings ([e655387](https://github.com/Silverlan/pragma/commit/e6553876538d8d71f434c4b69ad11cf141a98a93))
- **lua:** add model, physics and misc bindings ([807dc8c](https://github.com/Silverlan/pragma/commit/807dc8c3d658d76992fcd1084a0c1dc4b0e2e181))
- **lua:** add options for custom push constants and material data initialization for Lua-based shaders ([03c9f4c](https://github.com/Silverlan/pragma/commit/03c9f4c25f2b06422efe7291288afbfaae55c52a))
- **lua:** add panima function bindings for merging channels and animations ([521991c](https://github.com/Silverlan/pragma/commit/521991c4c691a22a29f46da61f96890279c8e1ee))
- **lua:** add panima.Channel:TestValueExpression ([8705de2](https://github.com/Silverlan/pragma/commit/8705de23c47f56799bd2d6241e6868cdb0530abc))
- **lua:** add parameter to asset.import\_model and asset.import\_gltf for importing model as collection or single model ([2038c26](https://github.com/Silverlan/pragma/commit/2038c26b7ce3b0fc1b30c9154fc678532dceb62a))
- **lua:** add prosper.Window:GetWindowTitle ([9c91196](https://github.com/Silverlan/pragma/commit/9c911969e10a3c43989c86c29829ec97a1658d6e))
- **lua:** add string.snake\_case\_to\_camel\_case and string.camel\_case\_to\_snake\_case bindings ([273feb0](https://github.com/Silverlan/pragma/commit/273feb05071eee43cfac92c71a71fbfdfe8d36e7))
- **lua:** add support for displaying object types when debugging with lua-debug ([e5a474b](https://github.com/Silverlan/pragma/commit/e5a474b060300a316495f57955bf7828776dc593)), closes [/github.com/actboy168/lua-debug/issues/237#issuecomment-1477469263](https://github.com//github.com/actboy168/lua-debug/issues/237/issues/issuecomment-1477469263)
- **lua:** add support for displaying object values when debugging with lua-debug ([2451782](https://github.com/Silverlan/pragma/commit/2451782f17e35dab15d05a3465a6d2170ee57ece))
- **lua:** add udm.is\_convertible binding ([9535e18](https://github.com/Silverlan/pragma/commit/9535e18076c1dbd58139004b501b504b344ae042))
- **lua:** add util.ImageBuffer:Insert bindings ([7cc2ff8](https://github.com/Silverlan/pragma/commit/7cc2ff8bb8fcdd9fd25c212a0dbc6650275d9dc7))
- **lua:** ents.Entity:FindMemberInfo now also returns component reference ([8018ad9](https://github.com/Silverlan/pragma/commit/8018ad954228e9b59a61cd9d7486c0364b71e8ac))
- **lua:** rename ik.Solver:RemoveDragControl to ik.Solver:RemoveControl ([9f498d7](https://github.com/Silverlan/pragma/commit/9f498d71bbf57e8c312e0991e31a2b37e9a6bb3b))
- map format can now contain entity component data ([de913ce](https://github.com/Silverlan/pragma/commit/de913ce48724e3ea376bcfd346c4c15d287f9e3c))
- performance improvements ([71fb75c](https://github.com/Silverlan/pragma/commit/71fb75c8bc83c71809cf46a85014ae0743543583))
- reduce weight of directional light sources when calculating dominant light direction ([b935e2b](https://github.com/Silverlan/pragma/commit/b935e2b54ea0bf5b01b0721726ce6d1774c5638b))
- remove ambient color from shader render settings and add camera fov ([e6e7bb5](https://github.com/Silverlan/pragma/commit/e6e7bb59dff427e85a9ad1b5eb89c509d71f0bec))
- update intel vtune path references to version 2023.0.0 ([812e0f7](https://github.com/Silverlan/pragma/commit/812e0f77276066a6f11974ee3a392dd967ea7753))
- update panima submodule ([04c72ec](https://github.com/Silverlan/pragma/commit/04c72ec14b14187359a2fc94e0744c0e3b5474a5))
- update sharedutils submodule ([7d0e338](https://github.com/Silverlan/pragma/commit/7d0e338698298a5678ac2367b2702b1eb3b766d4))
- update sharedutils submodule ([048f8a4](https://github.com/Silverlan/pragma/commit/048f8a467922ffaf2f243130df824b06de59b0d9))
- update sharedutils submodule ([8476465](https://github.com/Silverlan/pragma/commit/847646572b112c067393bfdabc97aa8b61695f50))
- update util\_image submodule ([8b48504](https://github.com/Silverlan/pragma/commit/8b485048bbc38012b8a2822c3eece35bd044073f))
- various animation driver updates and improvements ([80953a8](https://github.com/Silverlan/pragma/commit/80953a83ad1b795803e7a58c82ce87f36cdb3ea3))
- **windows:** change console font to "Ubuntu Mono" ([f290627](https://github.com/Silverlan/pragma/commit/f2906271e9af1769af8c5042c3f00225160c2f38))

### Bug Fixes

- add missing include ([c16c6d1](https://github.com/Silverlan/pragma/commit/c16c6d10077d85f49e04323e8ff15f930685991c))
- add missing origin component source code files ([c1ad5eb](https://github.com/Silverlan/pragma/commit/c1ad5eba953b72b26b2acb6c5498e44b20b734a4))
- changing collisions of a physics constraint having no effect ([e76ac98](https://github.com/Silverlan/pragma/commit/e76ac98bea59e2f475a810277a4f49193e17749f))
- clang compile error ([b147489](https://github.com/Silverlan/pragma/commit/b147489cb2a3530401b25cd7eb4538922c5862d5))
- crash when doing mouse or keyboard input before main window has been created ([4855962](https://github.com/Silverlan/pragma/commit/4855962f077eb603944afc2b717926aee5b39da5))
- **ecs:** add missing component property registration for bone pose property of animated component ([edb3798](https://github.com/Silverlan/pragma/commit/edb3798fba998521396f8e012a792666f6009e81))
- **ecs:** fix enabling or disabling axis for child-of constraint not having any effect ([362dbed](https://github.com/Silverlan/pragma/commit/362dbed653d55349ecc0701125db3f9215222ef9))
- **ecs:** fix Lua errors in lua\_script component ([343ec34](https://github.com/Silverlan/pragma/commit/343ec34c290051a60c52c137849f3605e8467c90))
- **ecs:** fix lua errors when loading lua\_script entity component ([a32a0d4](https://github.com/Silverlan/pragma/commit/a32a0d43088aa376f1379cb9363f34c2295ac6d9))
- **ecs:** fix space constraint component axes being inverted by default ([83fae4a](https://github.com/Silverlan/pragma/commit/83fae4ad3f62fdb6f5b70b83e8afe6337a42c981))
- **ecs:** resolve various ik\_solver component issues ([9ab5716](https://github.com/Silverlan/pragma/commit/9ab5716b8238f0e3c8256ced07bc66bfd3620822))
- **ecs:** resolve various ik\_solver component issues ([5931047](https://github.com/Silverlan/pragma/commit/5931047a816768b10b8e69578566de7b3a982aec))
- fix "color" keyvalue for color component being interpreted incorrectly ([4a3faa4](https://github.com/Silverlan/pragma/commit/4a3faa41543a2afcec88c1518b0524bb0a247846))
- fix "debug\_hdr\_bloom" console command not working properly ([a5ceec4](https://github.com/Silverlan/pragma/commit/a5ceec4bbdb5fa2506222f3e71dfe4f5f06944ee))
- fix accessing invalid iterator when removing entity component from within OnRemove ([6c60c49](https://github.com/Silverlan/pragma/commit/6c60c49eca7dfa66181e6fa725e84d065790391e))
- fix BaseEntityComponent::SetTransformMember\* functions applying value incorrectly if value is in world space and property expects value to be in local space ([79a0a2c](https://github.com/Silverlan/pragma/commit/79a0a2cdf5c6e6e38b2c2bbaca6a9dd8a2710a5a))
- fix build error ([9c5ff63](https://github.com/Silverlan/pragma/commit/9c5ff639ea8eca5f61cdfd9c109cc0ac12319230))
- fix build error ([313436a](https://github.com/Silverlan/pragma/commit/313436ae6d6819ebc48adb79196495f850ba54f9))
- fix build error on latest Visual Studio version ([20b1ad8](https://github.com/Silverlan/pragma/commit/20b1ad807356800a01dda95a2f9fb482cff3deb9))
- fix clang compile error ([3b493af](https://github.com/Silverlan/pragma/commit/3b493af043c0bf22533ce2c346ea9f30f73a7d7c))
- fix ClickComponent.raycast not applying filter correctly to static entities ([cfbfa5b](https://github.com/Silverlan/pragma/commit/cfbfa5b50cacf1de3c94c35730403fd94fe30039))
- fix component properties not being saved when saving map data ([2a91492](https://github.com/Silverlan/pragma/commit/2a91492b7a7ee6f91904087bce400ca03373124d))
- fix component property references not working if property path has multiple path components ([41bb680](https://github.com/Silverlan/pragma/commit/41bb680aff686f305f6ce2a2790fa5497ee1fcbb))
- fix crash when removing entity with panima component ([30e029e](https://github.com/Silverlan/pragma/commit/30e029edfb7d86f49cda8f83a4da3c9c499dbfce))
- fix importing gltf as model not applying mesh scaling correctly ([87cf3cc](https://github.com/Silverlan/pragma/commit/87cf3cce751f116bfdd9371e73de03e96caddc03))
- fix importing gltf as multiple models resulting in invalid bodygroup references ([3993611](https://github.com/Silverlan/pragma/commit/399361178fd3e5425884fed4ec5f243997649d26))
- fix invalid memory read access ([8e2c045](https://github.com/Silverlan/pragma/commit/8e2c045ed337658d80ce85838796ce4f1ab54c6c))
- fix limit location/rotation/scale components not working if no driver was specified ([17362ef](https://github.com/Silverlan/pragma/commit/17362efb31aa8d912c054fe44ac758007d3e2af5))
- fix limit\_distance component not working properly ([fcc60fb](https://github.com/Silverlan/pragma/commit/fcc60fb8b826c6d381a4f95fa5bdd2d88aac3844))
- fix memory corruption issue ([9dd303f](https://github.com/Silverlan/pragma/commit/9dd303ff768b42461f6fa045bac70aaba20fe226))
- fix ModelSubMesh::SetVertexWeight using wrong vertex weight set ([3a30e1b](https://github.com/Silverlan/pragma/commit/3a30e1bbe71d6bd968f32283172b9298970c2fd2))
- fix obsolete model path ([cb063d2](https://github.com/Silverlan/pragma/commit/cb063d252e9eb622fb208dcf2d0d91bd660cd880))
- fix potential crash when loading a map ([19fa263](https://github.com/Silverlan/pragma/commit/19fa263008f0208a77dfe700232eafe638746d24))
- fix potential exception in BaseEntity::CreateMemberReference ([1ce36ac](https://github.com/Silverlan/pragma/commit/1ce36ac4142a71a2280de6688201347fe65b9840))
- fix potential null pointer access ([6ddb2c6](https://github.com/Silverlan/pragma/commit/6ddb2c6b88f098d82d42d76e04c54f0b108212a9))
- fix pragma::get\_component\_member\_name\_hash and pragma::get\_normalized\_component\_member\_name returning incorrect results ([d66af40](https://github.com/Silverlan/pragma/commit/d66af40beadb3749bbe0eca63f2a51c8adda0b8d))
- fix warning about missing static\_bvh\_cache component during map load ([82479eb](https://github.com/Silverlan/pragma/commit/82479eb09710d4be777de254d9e72a360cdaef81))
- **gui:** fix file explorer adding additional slash to path if file is in root directory ([16f4def](https://github.com/Silverlan/pragma/commit/16f4def3ce55ac206c937c24530d86c36434eae7))
- **linux:** fix build errors due to missing std::format library ([5a25f4d](https://github.com/Silverlan/pragma/commit/5a25f4dc37244460a34c444fdc3e484d76ddcd4f))
- **linux:** resolve compile errors ([608da84](https://github.com/Silverlan/pragma/commit/608da84f9e12faf9972e0a81b7e02ab1c905c996))
- **log:** resolve various logging inconsistencies ([0682925](https://github.com/Silverlan/pragma/commit/06829258e57bef2147c777c8d9619a2600b8148a))
- **lua,gui:** resolve issue where "OnTextChanged" callback would not work for "WIText" GUI elements ([ce84793](https://github.com/Silverlan/pragma/commit/ce847932be36e04f068f8263a6f89c34415b50ad))
- **lua:** add ents.create\_entity\_uri and ents.create\_component\_uri bindings ([1dfac80](https://github.com/Silverlan/pragma/commit/1dfac805e6b09c110f86e0d1787a4ea17377ceb9))
- **lua:** fix duplicate bound "tostring" method for entity components ([954323a](https://github.com/Silverlan/pragma/commit/954323ad3ba93c77f7945df9b7f8daca51a4824e))
- **lua:** fix ents.BhvComponent.HitInfo.entity not using correct lua object ([1ae8906](https://github.com/Silverlan/pragma/commit/1ae8906ebcfa94c002b183fedac573d574282730))
- **lua:** fix ents.UniversalMemberReference:GetPath not returning correct path in some cases ([6bc89ff](https://github.com/Silverlan/pragma/commit/6bc89ff5b57ac1782757d489a380c9d713b65741))
- **lua:** fix error when calling log.prefix ([e8203c3](https://github.com/Silverlan/pragma/commit/e8203c3a1877d2ac5c6ad3f29a214e9fee1e60ad))
- **lua:** fix incorrect constness for some lua bindings ([7000a7f](https://github.com/Silverlan/pragma/commit/7000a7f34bf77bcfc529a2af40c580eea78ee9f5))
- **lua:** fix lua error when calling ents.UniversalComponentReference:GetComponentName ([12ba931](https://github.com/Silverlan/pragma/commit/12ba9314332ae75fdaa5983429e7a11ce0704432))
- **lua:** fix module paths not being set up properly unless remote debugging is enabled for lua state ([7de40ff](https://github.com/Silverlan/pragma/commit/7de40ff840cc5c954c861a24b08682362e6c5894))
- **lua:** fix potential invalid memory access in util.generate\_hair\_data ([7ae2ffd](https://github.com/Silverlan/pragma/commit/7ae2ffd95a4e04a61c4d425b20013659ee816102))
- **lua:** fix type enums for ik rig constraints being bound with wrong class ([7ef9257](https://github.com/Silverlan/pragma/commit/7ef9257fc0a7760b7e5d1a3c95694aefa1bb4fed))
- **lua:** implement missing features for transform component property type ([d40c88d](https://github.com/Silverlan/pragma/commit/d40c88d946811da939c4a3f2e68aef0c1a8db2d8))
- **lua:** resolve issue where udm GetValue functions would return nil if property is of type element ([5a211e8](https://github.com/Silverlan/pragma/commit/5a211e863ddb253b59b88480ec9a481c8de267c2))
- **lua:** resolve issue where universal entity reference constructors would not accept uuid objects ([f7b35d6](https://github.com/Silverlan/pragma/commit/f7b35d677f2139dd1a7eac74a4b22b129b5a9198))
- ModelSubMesh::GetVertexWeight - resolve issue where incorrect vertex weight set would be used ([fff66d9](https://github.com/Silverlan/pragma/commit/fff66d9660a0dd05bc322e21818e4eb9e80fa375))
- resolve compile errors ([6079768](https://github.com/Silverlan/pragma/commit/6079768f5255de10b560b48bb7d79095b706597f))
- resolve issue where console would not get initialized fully unless created at engine startup ([1165a97](https://github.com/Silverlan/pragma/commit/1165a975a34a5c47b29924c4f4dcaa969f04cc65))
- resolve issue where crashdump would not generate properly ([a0df754](https://github.com/Silverlan/pragma/commit/a0df7542ad779f8770208094e05b55b9b0eeb388))
- resolve issue where debug render objects could accumulate and not be flushed when no scenes are being rendered ([a9ba75e](https://github.com/Silverlan/pragma/commit/a9ba75e5fcb24bcf17cf39e1859ff771c1efe530))
- resolve issue where entities in map generated from imported gltf would all have same uuid ([beca3c8](https://github.com/Silverlan/pragma/commit/beca3c88accf6a20bbee9128e4482d1aebc01089))
- resolve issue where entity render buffer would not be initialized properly ([6b9e379](https://github.com/Silverlan/pragma/commit/6b9e37973a8825070d976bc2c02be94d19e11995))
- resolve issue where ik rigs could not be saved ([8500d0a](https://github.com/Silverlan/pragma/commit/8500d0affb9bed144fd6be4166f6364e18cda035))
- resolve issue where importing a model through the model explorer would fail ([e93b81c](https://github.com/Silverlan/pragma/commit/e93b81c9d4e4d9804972925a0dd01c6b08796602))
- resolve issue where lua source file could not be determined correctly ([4ccd7ce](https://github.com/Silverlan/pragma/commit/4ccd7cea9d90b340a93a8190258961086625e97c))
- resolve issue where Lua-script for Lua-based entity would not be loaded if invoked by creation of another Lua-based entity ([6feee4a](https://github.com/Silverlan/pragma/commit/6feee4a27a6480b7731bc49e975664d9fc17608c))
- resolve issue where material and entity color factor would be interpreted as srgb instead of linear ([6cc1778](https://github.com/Silverlan/pragma/commit/6cc1778c71ca67d470e03c038bdc4920bb30b601))
- resolve issue where objects from imported gltf assets would have incorrect rotation ([656399a](https://github.com/Silverlan/pragma/commit/656399a9951acc261f9417045387f72222e1a297))
- resolve issue where panima components would not be updated properly if entity has no animated component ([85aaa9a](https://github.com/Silverlan/pragma/commit/85aaa9a2a328b199cafd0cba812b43487bf53fa3))
- resolve issue where saving a model would not save the reference animation correctly ([be93859](https://github.com/Silverlan/pragma/commit/be938593f133f3e6a035f31a246e781fe84661c2))
- resolve memory corruption issues ([7ed7018](https://github.com/Silverlan/pragma/commit/7ed70186491691e9b4d68a7b414083fc0ad97635))
- resolve potential crash when multiple scenes with debug objects are rendered at the same time ([31527e2](https://github.com/Silverlan/pragma/commit/31527e243af1cc26cce0e7bc29ea9c9f9782505e))
- resolve potential crash with animation drivers when using parameter references of properties with certain types ([3f34a22](https://github.com/Silverlan/pragma/commit/3f34a224480426bd725686842818cc2d179e6fbe))
- temporarily disable multi-threading for animations ([524ad34](https://github.com/Silverlan/pragma/commit/524ad342c43bf2d05173599210c7fd737de3fd3e))