+
+
+| Token | Description |
+|---|---|
+|`{asset_name}` | Asset name |
+|`{asset_type}` | Asset type |
+|`{subset}` | Subset name |
+|`{family}` | Subset family |
+
+
+
+
+The namespace field can contain a single group of '#' number tokens to indicate where the namespace's unique index should go. The amount of tokens defines the zero padding of the number, e.g ### turns into 001.
+
+Warning: Note that a namespace will always be prefixed with a _ if it starts with a digit.
+
+Example:
+
+
+
### Extract GPU Cache

@@ -169,6 +200,17 @@ Most settings to override in the viewport are self explanatory and can be found
These options are set on the camera shape when publishing the review. They correspond to attributes on the Maya camera shape node.

+## Include/exclude handles by task type
+You can include or exclude handles, globally or by task type.
+
+The "Include handles by default" defines whether by default handles are included. Additionally you can add a per task type override whether you want to include or exclude handles.
+
+For example, in this image you can see that handles are included by default in all task types, except for the 'Lighting' task, where the toggle is disabled.
+
+
+And here you can see that the handles are disabled by default, except in 'Animation' task where it's enabled.
+
+
## Custom Menu
You can add your custom tools menu into Maya by extending definitions in **Maya -> Scripts Menu Definition**.
@@ -232,3 +274,14 @@ Fill in the necessary fields (the optional fields are regex filters)
- Build your workfile

+
+## Explicit Plugins Loading
+You can define which plugins to load on launch of Maya here; `project_settings/maya/explicit_plugins_loading`. This can help improve Maya's launch speed, if you know which plugins are needed.
+
+By default only the required plugins are enabled. You can also add any plugin to the list to enable on launch.
+
+:::note technical
+When enabling this feature, the workfile will be launched post initialization no matter the setting on `project_settings/maya/open_workfile_post_initialization`. This is to avoid any issues with references needing plugins.
+
+Renderfarm integration is not supported for this feature.
+:::
diff --git a/website/docs/admin_hosts_photoshop.md b/website/docs/admin_hosts_photoshop.md
new file mode 100644
index 0000000000..de684f01d2
--- /dev/null
+++ b/website/docs/admin_hosts_photoshop.md
@@ -0,0 +1,127 @@
+---
+id: admin_hosts_photoshop
+title: Photoshop Settings
+sidebar_label: Photoshop
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Photoshop settings
+
+There is a couple of settings that could configure publishing process for **Photoshop**.
+All of them are Project based, eg. each project could have different configuration.
+
+Location: Settings > Project > Photoshop
+
+
+
+## Color Management (ImageIO)
+
+Placeholder for Color Management. Currently not implemented yet.
+
+## Creator plugins
+
+Contains configurable items for creators used during publishing from Photoshop.
+
+### Create Image
+
+Provides list of [variants](artist_concepts.md#variant) that will be shown to an artist in Publisher. Default value `Main`.
+
+### Create Flatten Image
+
+Provides simplified publishing process. It will create single `image` instance for artist automatically. This instance will
+produce flatten image from all visible layers in a workfile.
+
+- Subset template for flatten image - provide template for subset name for this instance (example `imageBeauty`)
+- Review - should be separate review created for this instance
+
+### Create Review
+
+Creates single `review` instance automatically. This allows artists to disable it if needed.
+
+### Create Workfile
+
+Creates single `workfile` instance automatically. This allows artists to disable it if needed.
+
+## Publish plugins
+
+Contains configurable items for publish plugins used during publishing from Photoshop.
+
+### Collect Color Coded Instances
+
+Used only in remote publishing!
+
+Allows to create automatically `image` instances for configurable highlight color set on layer or group in the workfile.
+
+#### Create flatten image
+ - Flatten with images - produce additional `image` with all published `image` instances merged
+ - Flatten only - produce only merged `image` instance
+ - No - produce only separate `image` instances
+
+#### Subset template for flatten image
+
+Template used to create subset name automatically (example `image{layer}Main` - uses layer name in subset name)
+
+### Collect Review
+
+Disable if no review should be created
+
+### Collect Version
+
+If enabled it will push version from workfile name to all published items. Eg. if artist is publishing `test_asset_workfile_v005.psd`
+produced `image` and `review` files will contain `v005` (even if some previous version were skipped for particular family).
+
+### Validate Containers
+
+Checks if all imported assets to the workfile through `Loader` are in latest version. Limits cases that older version of asset would be used.
+
+If enabled, artist might still decide to disable validation for each publish (for special use cases).
+Limit this optionality by toggling `Optional`.
+`Active` toggle denotes that by default artists sees that optional validation as enabled.
+
+### Validate naming of subsets and layers
+
+Subset cannot contain invalid characters or extract to file would fail
+
+#### Regex pattern of invalid characters
+
+Contains weird characters like `/`, `/`, these might cause an issue when file (which contains subset name) is created on OS disk.
+
+#### Replacement character
+
+Replace all offending characters with this one. `_` is default.
+
+### Extract Image
+
+Controls extension formats of published instances of `image` family. `png` and `jpg` are by default.
+
+### Extract Review
+
+Controls output definitions of extracted reviews to upload on Asset Management (AM).
+
+#### Makes an image sequence instead of flatten image
+
+If multiple `image` instances are produced, glue created images into image sequence (`mov`) to review all of them separetely.
+Without it only flatten image would be produced.
+
+#### Maximum size of sources for review
+
+Set Byte limit for review file. Applicable if gigantic `image` instances are produced, full image size is unnecessary to upload to AM.
+
+#### Extract jpg Options
+
+Handles tags for produced `.jpg` representation. `Create review` and `Add review to Ftrack` are defaults.
+
+#### Extract mov Options
+
+Handles tags for produced `.mov` representation. `Create review` and `Add review to Ftrack` are defaults.
+
+
+### Workfile Builder
+
+Allows to open prepared workfile for an artist when no workfile exists. Useful to share standards, additional helpful content in the workfile.
+
+Could be configured per `Task type`, eg. `composition` task type could use different `.psd` template file than `art` task.
+Workfile template must be accessible for all artists.
+(Currently not handled by [SiteSync](module_site_sync.md))
\ No newline at end of file
diff --git a/website/docs/artist_concepts.md b/website/docs/artist_concepts.md
index 7582540811..1e55c8139d 100644
--- a/website/docs/artist_concepts.md
+++ b/website/docs/artist_concepts.md
@@ -14,17 +14,29 @@ OpenPype has a limitation regarding duplicated names. Name of assets must be uni
### Subset
-Usually, an asset needs to be created in multiple *'flavours'*. A character might have multiple different looks, model needs to be published in different resolutions, a standard animation rig might not be usable in a crowd system and so on. 'Subsets' are here to accommodate all this variety that might be needed within a single asset. A model might have subset: *'main'*, *'proxy'*, *'sculpt'*, while data of *'look'* family could have subsets *'main'*, *'dirty'*, *'damaged'*. Subsets have some recommendations for their names, but ultimately it's up to the artist to use them for separation of publishes when needed.
+A published output from an asset results in a subset.
+
+The subset type is referred to as [family](#family), for example a rig, pointcache, look.
+A single asset can have many subsets, even of a single family, named [variants](#variant).
+By default a subset is named as a combination of family + variant, sometimes prefixed with the task name (like workfile).
+
+### Variant
+
+Usually, an asset needs to be created in multiple *'flavours'*. A character might have multiple different looks, model needs to be published in different resolutions, a standard animation rig might not be usable in a crowd system and so on. 'Variants' are here to accommodate all this variety that might be needed within a single asset. A model might have variant: *'main'*, *'proxy'*, *'sculpt'*, while data of *'look'* family could have subsets *'main'*, *'dirty'*, *'damaged'*. Variants have some recommendations for their names, but ultimately it's up to the artist to use them for separation of publishes when needed.
### Version
-A numbered iteration of a given subset. Each version contains at least one [representation][daa74ebf].
+A numbered iteration of a given subset. Each version contains at least one [representation](#representation).
- [daa74ebf]: #representation "representation"
+#### Hero version
+
+A hero version is a version that is always the latest published version. When a new publish is generated its written over the previous hero version replacing it in-place as opposed to regular versions where each new publish is a higher version number.
+
+This is an optional feature. The generation of hero versions can be completely disabled in OpenPype by an admin through the Studio Settings.
### Representation
-Each published variant can come out of the software in multiple representations. All of them hold exactly the same data, but in different formats. A model, for example, might be saved as `.OBJ`, Alembic, Maya geometry or as all of them, to be ready for pickup in any other applications supporting these formats.
+Each published subset version can come out of the software in multiple representations. All of them hold exactly the same data, but in different formats. A model, for example, might be saved as `.OBJ`, Alembic, Maya geometry or as all of them, to be ready for pickup in any other applications supporting these formats.
#### Naming convention
@@ -33,18 +45,22 @@ At this moment names of assets, tasks, subsets or representations can contain on
### Family
-Each published [subset][3b89d8e0] can have exactly one family assigned to it. Family determines the type of data that the subset holds. Family doesn't dictate the file type, but can enforce certain technical specifications. For example OpenPype default configuration expects `model` family to only contain geometry without any shaders or joints when it is published.
+Each published [subset](#subset) can have exactly one family assigned to it. Family determines the type of data that the subset holds. Family doesn't dictate the file type, but can enforce certain technical specifications. For example OpenPype default configuration expects `model` family to only contain geometry without any shaders or joints when it is published.
+### Task
- [3b89d8e0]: #subset "subset"
+A task defines a work area for an asset where an artist can work in. For example asset *characterA* can have tasks named *modeling* and *rigging*. Tasks also have types. Multiple tasks of the same type may exist on an asset. A task with type `fx` could for example appear twice as *fx_fire* and *fx_cloth*.
+Without a task you cannot launch a host application.
+### Workfile
+
+The source scene file an artist works in within their task. These are versioned scene files and can be loaded and saved (automatically named) through the [workfiles tool](artist_tools_workfiles.md).
### Host
General term for Software or Application supported by OpenPype and Avalon. These are usually DCC applications like Maya, Houdini or Nuke, but can also be a web based service like Ftrack or Clockify.
-
### Tool
Small piece of software usually dedicated to a particular purpose. Most of OpenPype and Avalon tools have GUI, but some are command line only.
@@ -54,6 +70,10 @@ Small piece of software usually dedicated to a particular purpose. Most of OpenP
Process of exporting data from your work scene to versioned, immutable file that can be used by other artists in the studio.
+#### (Publish) Instance
+
+A publish instance is a single entry which defines a publish output. Publish instances persist within the workfile. This way we can expect that a publish from a newer workfile will produce similar consistent versioned outputs.
+
### Load
Process of importing previously published subsets into your current scene, using any of the OpenPype tools.
diff --git a/website/docs/artist_hosts_houdini.md b/website/docs/artist_hosts_houdini.md
index f2b128ffc6..8874a0b5cf 100644
--- a/website/docs/artist_hosts_houdini.md
+++ b/website/docs/artist_hosts_houdini.md
@@ -14,20 +14,29 @@ sidebar_label: Houdini
- [Library Loader](artist_tools_library-loader)
## Publishing Alembic Cameras
-You can publish baked camera in Alembic format. Select your camera and go **OpenPype -> Create** and select **Camera (abc)**.
+You can publish baked camera in Alembic format.
+
+Select your camera and go **OpenPype -> Create** and select **Camera (abc)**.
This will create Alembic ROP in **out** with path and frame range already set. This node will have a name you've
assigned in the **Creator** menu. For example if you name the subset `Default`, output Alembic Driver will be named
`cameraDefault`. After that, you can **OpenPype -> Publish** and after some validations your camera will be published
to `abc` file.
## Publishing Composites - Image Sequences
-You can publish image sequence directly from Houdini. You can use any `cop` network you have and publish image
-sequence generated from it. For example I've created simple **cop** graph to generate some noise:
+You can publish image sequences directly from Houdini's image COP networks.
+
+You can use any COP node and publish the image sequence generated from it. For example this simple graph to generate some noise:
+

-If I want to publish it, I'll select node I like - in this case `radialblur1` and go **OpenPype -> Create** and
-select **Composite (Image Sequence)**. This will create `/out/imagesequenceNoise` Composite ROP (I've named my subset
-*Noise*) with frame range set. When you hit **Publish** it will render image sequence from selected node.
+To publish the output of the `radialblur1` go to **OpenPype -> Create** and
+select **Composite (Image Sequence)**. If you name the variant *Noise* this will create the `/out/imagesequenceNoise` Composite ROP with the frame range set.
+
+When you hit **Publish** it will render image sequence from selected node.
+
+:::info Use selection
+With *Use selection* is enabled on create the node you have selected when creating will be the node used for published. (It set the Composite ROP node's COP path to it). If you don't do this you'll have to manually set the path as needed on e.g. `/out/imagesequenceNoise` to ensure it outputs what you want.
+:::
## Publishing Point Caches (alembic)
Publishing point caches in alembic format is pretty straightforward, but it is by default enforcing better compatibility
@@ -46,6 +55,16 @@ you handle `path` attribute is up to you, this is just an example.*
Now select the `output0` node and go **OpenPype -> Create** and select **Point Cache**. It will create
Alembic ROP `/out/pointcacheStrange`
+## Publishing Reviews (OpenGL)
+To generate a review output from Houdini you need to create a **review** instance.
+Go to **OpenPype -> Create** and select **Review**.
+
+
+
+On create, with the **Use Selection** checkbox enabled it will set up the first
+camera found in your selection as the camera for the OpenGL ROP node and other
+non-cameras are set in **Force Objects**. It will then render those even if
+their display flag is disabled in your scene.
## Redshift
:::note Work in progress
diff --git a/website/docs/artist_hosts_maya.md b/website/docs/artist_hosts_maya.md
index 0a551f0213..e36ccb77d2 100644
--- a/website/docs/artist_hosts_maya.md
+++ b/website/docs/artist_hosts_maya.md
@@ -238,12 +238,12 @@ For resolution and frame range, use **OpenPype → Set Frame Range** and
Creating and publishing rigs with OpenPype follows similar workflow as with
other data types. Create your rig and mark parts of your hierarchy in sets to
-help OpenPype validators and extractors to check it and publish it.
+help OpenPype validators and extractors to check and publish it.
### Preparing rig for publish
When creating rigs, it is recommended (and it is in fact enforced by validators)
-to separate bones or driving objects, their controllers and geometry so they are
+to separate bones or driven objects, their controllers and geometry so they are
easily managed. Currently OpenPype doesn't allow to publish model at the same time as
its rig so for demonstration purposes, I'll first create simple model for robotic
arm, just made out of simple boxes and I'll publish it.
@@ -252,41 +252,48 @@ arm, just made out of simple boxes and I'll publish it.
For more information about publishing models, see [Publishing models](artist_hosts_maya.md#publishing-models).
-Now lets start with empty scene. Load your model - **OpenPype → Load...**, right
+Now let's start with empty scene. Load your model - **OpenPype → Load...**, right
click on it and select **Reference (abc)**.
-I've created few bones and their controllers in two separate
-groups - `rig_GRP` and `controls_GRP`. Naming is not important - just adhere to
-your naming conventions.
+I've created a few bones in `rig_GRP`, their controllers in `controls_GRP` and
+placed the rig's output geometry in `geometry_GRP`. Naming of the groups is not important - just adhere to
+your naming conventions. Then I parented everything into a single top group named `arm_rig`.
-Then I've put everything into `arm_rig` group.
-
-When you've prepared your hierarchy, it's time to create *Rig instance* in OpenPype.
-Select your whole rig hierarchy and go **OpenPype → Create...**. Select **Rig**.
-Set is created in your scene to mark rig parts for export. Notice that it has
-two subsets - `controls_SET` and `out_SET`. Put your controls into `controls_SET`
+With the prepared hierarchy it is time to create a *Rig instance* in OpenPype.
+Select the top group of your rig and go to **OpenPype → Create...**. Select **Rig**.
+A publish set for your rig is created in your scene to mark rig parts for export.
+Notice that it has two subsets - `controls_SET` and `out_SET`. Put your controls into `controls_SET`
and geometry to `out_SET`. You should end up with something like this:

+:::note controls_SET and out_SET contents
+It is totally allowed to put the `geometry_GRP` in the `out_SET` as opposed to
+the individual meshes - it's even **recommended**. However, the `controls_SET`
+requires the individual controls in it that the artist is supposed to animate
+and manipulate so the publish validators can accurately check the rig's
+controls.
+:::
+
### Publishing rigs
-Publishing rig is done in same way as publishing everything else. Save your scene
-and go **OpenPype → Publish**. When you run validation you'll mostly run at first into
-few issues. Although number of them will seem to be intimidating at first, you'll
-find out they are mostly minor things easily fixed.
+Publishing rigs is done in a same way as publishing everything else. Save your scene
+and go **OpenPype → Publish**. When you run validation you'll most likely run into
+a few issues at first. Although a number of them will seem to be intimidating you
+will find out they are mostly minor things, easily fixed and are there to optimize
+your rig for consistency and safe usage by the artist.
-* **Non Duplicate Instance Members (ID)** - This will most likely fail because when
+- **Non Duplicate Instance Members (ID)** - This will most likely fail because when
creating rigs, we usually duplicate few parts of it to reuse them. But duplication
will duplicate also ID of original object and OpenPype needs every object to have
unique ID. This is easily fixed by **Repair** action next to validator name. click
on little up arrow on right side of validator name and select **Repair** form menu.
-* **Joints Hidden** - This is enforcing joints (bones) to be hidden for user as
+- **Joints Hidden** - This is enforcing joints (bones) to be hidden for user as
animator usually doesn't need to see them and they clutter his viewports. So
well behaving rig should have them hidden. **Repair** action will help here also.
-* **Rig Controllers** will check if there are no transforms on unlocked attributes
+- **Rig Controllers** will check if there are no transforms on unlocked attributes
of controllers. This is needed because animator should have ease way to reset rig
to it's default position. It also check that those attributes doesn't have any
incoming connections from other parts of scene to ensure that published rig doesn't
@@ -297,6 +304,19 @@ have any missing dependencies.
You can load rig with [Loader](artist_tools_loader). Go **OpenPype → Load...**,
select your rig, right click on it and **Reference** it.
+### Animation instances
+
+Whenever you load a rig an animation publish instance is automatically created
+for it. This means that if you load a rig you don't need to create a pointcache
+instance yourself to publish the geometry. This is all cleanly prepared for you
+when loading a published rig.
+
+:::tip Missing animation instance for your loaded rig?
+Did you accidentally delete the animation instance for a loaded rig? You can
+recreate it using the [**Recreate rig animation instance**](artist_hosts_maya.md#recreate-rig-animation-instance)
+inventory action.
+:::
+
## Point caches
OpenPype is using Alembic format for point caches. Workflow is very similar as
other data types.
@@ -646,3 +666,15 @@ Select 1 container of type `animation` or `pointcache`, then 1+ container of any
The action searches the selected containers for 1 animation container of type `animation` or `pointcache`. This animation container will be connected to the rest of the selected containers. Matching geometries between containers is done by comparing the attribute `cbId`.
The connection between geometries is done with a live blendshape.
+
+### Recreate rig animation instance
+
+This action can regenerate an animation instance for a loaded rig, for example
+for when it was accidentally deleted by the user.
+
+
+
+#### Usage
+
+Select 1 or more container of type `rig` for which you want to recreate the
+animation instance.
diff --git a/website/docs/artist_hosts_maya_xgen.md b/website/docs/artist_hosts_maya_xgen.md
index ec5f2ed921..db7bbd0557 100644
--- a/website/docs/artist_hosts_maya_xgen.md
+++ b/website/docs/artist_hosts_maya_xgen.md
@@ -43,6 +43,10 @@ Create an Xgen instance to publish. This needs to contain only **one Xgen collec
You can create multiple Xgen instances if you have multiple collections to publish.
+:::note
+The Xgen publishing requires a namespace on the Xgen collection (palette) and the geometry used.
+:::
+
### Publish
The publishing process will grab geometry used for Xgen along with any external files used in the collection's descriptions. This creates an isolated Maya file with just the Xgen collection's dependencies, so you can use any nested geometry when creating the Xgen description. An Xgen version will consist of:
diff --git a/website/docs/artist_hosts_substancepainter.md b/website/docs/artist_hosts_substancepainter.md
new file mode 100644
index 0000000000..86bcbba82e
--- /dev/null
+++ b/website/docs/artist_hosts_substancepainter.md
@@ -0,0 +1,107 @@
+---
+id: artist_hosts_substancepainter
+title: Substance Painter
+sidebar_label: Substance Painter
+---
+
+## OpenPype global tools
+
+- [Work Files](artist_tools.md#workfiles)
+- [Load](artist_tools.md#loader)
+- [Manage (Inventory)](artist_tools.md#inventory)
+- [Publish](artist_tools.md#publisher)
+- [Library Loader](artist_tools.md#library-loader)
+
+## Working with OpenPype in Substance Painter
+
+The Substance Painter OpenPype integration allows you to:
+
+- Set the project mesh and easily keep it in sync with updates of the model
+- Easily export your textures as versioned publishes for others to load and update.
+
+## Setting the project mesh
+
+Substance Painter requires a project file to have a mesh path configured.
+As such, you can't start a workfile without choosing a mesh path.
+
+To start a new project using a published model you can _without an open project_
+use OpenPype > Load.. > Load Mesh on a supported publish. This will prompt you
+with a New Project prompt preset to that particular mesh file.
+
+If you already have a project open, you can also replace (reload) your mesh
+using the same Load Mesh functionality.
+
+After having the project mesh loaded or reloaded through the loader
+tool the mesh will be _managed_ by OpenPype. For example, you'll be notified
+on workfile open whether the mesh in your workfile is outdated. You can also
+set it to specific version using OpenPype > Manage.. where you can right click
+on the project mesh to perform _Set Version_
+
+:::info
+A Substance Painter project will always have only one mesh set. Whenever you
+trigger _Load Mesh_ from the loader this will **replace** your currently loaded
+mesh for your open project.
+:::
+
+## Publishing textures
+
+To publish your textures we must first create a `textureSet`
+publish instance.
+
+To create a **TextureSet instance** we will use OpenPype's publisher tool. Go
+to **OpenPype → Publish... → TextureSet**
+
+The texture set instance will define what Substance Painter export template (`.spexp`) to
+use and thus defines what texture maps will be exported from your workfile. This
+can be set with the **Output Template** attribute on the instance.
+
+:::info
+The TextureSet instance gets saved with your Substance Painter project. As such,
+you will only need to configure this once for your workfile. Next time you can
+just click **OpenPype → Publish...** and start publishing directly with the
+same settings.
+:::
+
+#### Publish per output map of the Substance Painter preset
+
+The Texture Set instance generates a publish per output map that is defined in
+the Substance Painter's export preset. For example a publish from a default
+PBR Metallic Roughness texture set results in six separate published subsets
+(if all the channels exist in your file).
+
+
+
+When publishing for example a texture set with variant **Main** six instances will
+be published with the variants:
+- Main.**BaseColor**
+- Main.**Emissive**
+- Main.**Height**
+- Main.**Metallic**
+- Main.**Normal**
+- Main.**Roughness**
+
+The bold output map name for the publish is based on the string that is pulled
+from the what is considered to be the static part of the filename templates in
+the export preset. The tokens like `$mesh` and `(_$colorSpace)` are ignored.
+So `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` becomes `BaseColor`.
+
+An example output for PBR Metallic Roughness would be:
+
+
+
+## Known issues
+
+#### Can't see the OpenPype menu?
+
+If you're unable to see the OpenPype top level menu in Substance Painter make
+sure you have launched Substance Painter through OpenPype and that the OpenPype
+Integration plug-in is loaded inside Substance Painter: **Python > openpype_plugin**
+
+#### Substance Painter + Steam
+
+Running the steam version of Substance Painter within OpenPype will require you
+to close the Steam executable before launching Substance Painter through OpenPype.
+Otherwise the Substance Painter process is launched using Steam's existing
+environment and thus will not be able to pick up the pipeline integration.
+
+This appears to be a limitation of how Steam works.
\ No newline at end of file
diff --git a/website/docs/assets/admin_hosts_photoshop_settings.png b/website/docs/assets/admin_hosts_photoshop_settings.png
new file mode 100644
index 0000000000..aaa6ecbed7
Binary files /dev/null and b/website/docs/assets/admin_hosts_photoshop_settings.png differ
diff --git a/website/docs/assets/houdini_review_create_attrs.png b/website/docs/assets/houdini_review_create_attrs.png
new file mode 100644
index 0000000000..8735e79914
Binary files /dev/null and b/website/docs/assets/houdini_review_create_attrs.png differ
diff --git a/website/docs/assets/maya-admin_custom_namespace.png b/website/docs/assets/maya-admin_custom_namespace.png
new file mode 100644
index 0000000000..80707ea727
Binary files /dev/null and b/website/docs/assets/maya-admin_custom_namespace.png differ
diff --git a/website/docs/assets/maya-admin_exclude_handles.png b/website/docs/assets/maya-admin_exclude_handles.png
new file mode 100644
index 0000000000..9a50f2c287
Binary files /dev/null and b/website/docs/assets/maya-admin_exclude_handles.png differ
diff --git a/website/docs/assets/maya-admin_include_handles.png b/website/docs/assets/maya-admin_include_handles.png
new file mode 100644
index 0000000000..88d2270ddc
Binary files /dev/null and b/website/docs/assets/maya-admin_include_handles.png differ
diff --git a/website/docs/assets/maya-inventory_action_recreate_animation_instance.png b/website/docs/assets/maya-inventory_action_recreate_animation_instance.png
new file mode 100644
index 0000000000..42a6f26964
Binary files /dev/null and b/website/docs/assets/maya-inventory_action_recreate_animation_instance.png differ
diff --git a/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png b/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png
new file mode 100644
index 0000000000..35a4545f83
Binary files /dev/null and b/website/docs/assets/substancepainter_pbrmetallicroughness_export_preset.png differ
diff --git a/website/docs/assets/substancepainter_pbrmetallicroughness_published.png b/website/docs/assets/substancepainter_pbrmetallicroughness_published.png
new file mode 100644
index 0000000000..15b0e5b876
Binary files /dev/null and b/website/docs/assets/substancepainter_pbrmetallicroughness_published.png differ
diff --git a/website/docs/module_site_sync.md b/website/docs/module_site_sync.md
index 3e5794579c..68f56cb548 100644
--- a/website/docs/module_site_sync.md
+++ b/website/docs/module_site_sync.md
@@ -7,80 +7,112 @@ sidebar_label: Site Sync
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
+Site Sync allows users and studios to synchronize published assets between
+multiple 'sites'. Site denotes a storage location,
+which could be a physical disk, server, cloud storage. To be able to use site
+sync, it first needs to be configured.
-:::warning
-**This feature is** currently **in a beta stage** and it is not recommended to rely on it fully for production.
-:::
-
-Site Sync allows users and studios to synchronize published assets between multiple 'sites'. Site denotes a storage location,
-which could be a physical disk, server, cloud storage. To be able to use site sync, it first needs to be configured.
-
-The general idea is that each user acts as an individual site and can download and upload any published project files when they are needed. that way, artist can have access to the whole project, but only every store files that are relevant to them on their home workstation.
+The general idea is that each user acts as an individual site and can download
+and upload any published project files when they are needed. that way, artist
+can have access to the whole project, but only every store files that are
+relevant to them on their home workstation.
:::note
-At the moment site sync is only able to deal with publishes files. No workfiles will be synchronized unless they are published. We are working on making workfile synchronization possible as well.
+At the moment site sync is only able to deal with publishes files. No workfiles
+will be synchronized unless they are published. We are working on making
+workfile synchronization possible as well.
:::
## System Settings
-To use synchronization, *Site Sync* needs to be enabled globally in **OpenPype Settings/System/Modules/Site Sync**.
+To use synchronization, *Site Sync* needs to be enabled globally in **OpenPype
+Settings/System/Modules/Site Sync**.

-### Sites
+### Sites
By default there are two sites created for each OpenPype installation:
-- **studio** - default site - usually a centralized mounted disk accessible to all artists. Studio site is used if Site Sync is disabled.
-- **local** - each workstation or server running OpenPype Tray receives its own with unique site name. Workstation refers to itself as "local"however all other sites will see it under it's unique ID.
-Artists can explore their site ID by opening OpenPype Info tool by clicking on a version number in the tray app.
+- **studio** - default site - usually a centralized mounted disk accessible to
+ all artists. Studio site is used if Site Sync is disabled.
+- **local** - each workstation or server running OpenPype Tray receives its own
+ with unique site name. Workstation refers to itself as "local"however all
+ other sites will see it under it's unique ID.
-Many different sites can be created and configured on the system level, and some or all can be assigned to each project.
+Artists can explore their site ID by opening OpenPype Info tool by clicking on
+a version number in the tray app.
-Each OpenPype Tray app works with two sites at one time. (Sites can be the same, and no syncing is done in this setup).
+Many different sites can be created and configured on the system level, and
+some or all can be assigned to each project.
-Sites could be configured differently per project basis.
+Each OpenPype Tray app works with two sites at one time. (Sites can be the
+same, and no syncing is done in this setup).
-Each new site needs to be created first in `System Settings`. Most important feature of site is its Provider, select one from already prepared Providers.
+Sites could be configured differently per project basis.
-#### Alternative sites
+Each new site needs to be created first in `System Settings`. Most important
+feature of site is its Provider, select one from already prepared Providers.
+
+#### Alternative sites
This attribute is meant for special use cases only.
-One of the use cases is sftp site vendoring (exposing) same data as regular site (studio). Each site is accessible for different audience. 'studio' for artists in a studio via shared disk, 'sftp' for externals via sftp server with mounted 'studio' drive.
+One of the use cases is sftp site vendoring (exposing) same data as regular
+site (studio). Each site is accessible for different audience. 'studio' for
+artists in a studio via shared disk, 'sftp' for externals via sftp server with
+mounted 'studio' drive.
-Change of file status on one site actually means same change on 'alternate' site occurred too. (eg. artists publish to 'studio', 'sftp' is using
-same location >> file is accessible on 'sftp' site right away, no need to sync it anyhow.)
+Change of file status on one site actually means same change on 'alternate'
+site occurred too. (eg. artists publish to 'studio', 'sftp' is using
+same location >> file is accessible on 'sftp' site right away, no need to sync
+it anyhow.)
##### Example
+

-Admin created new `sftp` site which is handled by `SFTP` provider. Somewhere in the studio SFTP server is deployed on a machine that has access to `studio` drive.
+Admin created new `sftp` site which is handled by `SFTP` provider. Somewhere in
+the studio SFTP server is deployed on a machine that has access to `studio`
+drive.
Alternative sites work both way:
+
- everything published to `studio` is accessible on a `sftp` site too
-- everything published to `sftp` (most probably via artist's local disk - artists publishes locally, representation is marked to be synced to `sftp`. Immediately after it is synced, it is marked to be available on `studio` too for artists in the studio to use.)
+- everything published to `sftp` (most probably via artist's local disk -
+ artists publishes locally, representation is marked to be synced to `sftp`.
+ Immediately after it is synced, it is marked to be available on `studio` too
+ for artists in the studio to use.)
## Project Settings
-Sites need to be made available for each project. Of course this is possible to do on the default project as well, in which case all other projects will inherit these settings until overridden explicitly.
+Sites need to be made available for each project. Of course this is possible to
+do on the default project as well, in which case all other projects will
+inherit these settings until overridden explicitly.
You'll find the setting in **Settings/Project/Global/Site Sync**
-The attributes that can be configured will vary between sites and their providers.
+The attributes that can be configured will vary between sites and their
+providers.
## Local settings
-Each user should configure root folder for their 'local' site via **Local Settings** in OpenPype Tray. This folder will be used for all files that the user publishes or downloads while working on a project. Artist has the option to set the folder as "default"in which case it is used for all the projects, or it can be set on a project level individually.
+Each user should configure root folder for their 'local' site via **Local
+Settings** in OpenPype Tray. This folder will be used for all files that the
+user publishes or downloads while working on a project. Artist has the option
+to set the folder as "default"in which case it is used for all the projects, or
+it can be set on a project level individually.
-Artists can also override which site they use as active and remote if need be.
+Artists can also override which site they use as active and remote if need be.

-
## Providers
-Each site implements a so called `provider` which handles most common operations (list files, copy files etc.) and provides interface with a particular type of storage. (disk, gdrive, aws, etc.)
-Multiple configured sites could share the same provider with different settings (multiple mounted disks - each disk can be a separate site, while
+Each site implements a so called `provider` which handles most common
+operations (list files, copy files etc.) and provides interface with a
+particular type of storage. (disk, gdrive, aws, etc.)
+Multiple configured sites could share the same provider with different
+settings (multiple mounted disks - each disk can be a separate site, while
all share the same provider).
**Currently implemented providers:**
@@ -89,21 +121,30 @@ all share the same provider).
Handles files stored on disk storage.
-Local drive provider is the most basic one that is used for accessing all standard hard disk storage scenarios. It will work with any storage that can be mounted on your system in a standard way. This could correspond to a physical external hard drive, network mounted storage, internal drive or even VPN connected network drive. It doesn't care about how the drive is mounted, but you must be able to point to it with a simple directory path.
+Local drive provider is the most basic one that is used for accessing all
+standard hard disk storage scenarios. It will work with any storage that can be
+mounted on your system in a standard way. This could correspond to a physical
+external hard drive, network mounted storage, internal drive or even VPN
+connected network drive. It doesn't care about how the drive is mounted, but
+you must be able to point to it with a simple directory path.
Default sites `local` and `studio` both use local drive provider.
-
### Google Drive
-Handles files on Google Drive (this). GDrive is provided as a production example for implementing other cloud providers
+Handles files on Google Drive (this). GDrive is provided as a production
+example for implementing other cloud providers
-Let's imagine a small globally distributed studio which wants all published work for all their freelancers uploaded to Google Drive folder.
+Let's imagine a small globally distributed studio which wants all published
+work for all their freelancers uploaded to Google Drive folder.
For this use case admin needs to configure:
-- how many times it tries to synchronize file in case of some issue (network, permissions)
+
+- how many times it tries to synchronize file in case of some issue (network,
+ permissions)
- how often should synchronization check for new assets
-- sites for synchronization - 'local' and 'gdrive' (this can be overridden in local settings)
+- sites for synchronization - 'local' and 'gdrive' (this can be overridden in
+ local settings)
- user credentials
- root folder location on Google Drive side
@@ -111,30 +152,43 @@ Configuration would look like this:

-*Site Sync* for Google Drive works using its API: https://developers.google.com/drive/api/v3/about-sdk
+*Site Sync* for Google Drive works using its
+API: https://developers.google.com/drive/api/v3/about-sdk
-To configure Google Drive side you would need to have access to Google Cloud Platform project: https://console.cloud.google.com/
+To configure Google Drive side you would need to have access to Google Cloud
+Platform project: https://console.cloud.google.com/
To get working connection to Google Drive there are some necessary steps:
-- first you need to enable GDrive API: https://developers.google.com/drive/api/v3/enable-drive-api
-- next you need to create user, choose **Service Account** (for basic configuration no roles for account are necessary)
+
+- first you need to enable GDrive
+ API: https://developers.google.com/drive/api/v3/enable-drive-api
+- next you need to create user, choose **Service Account** (for basic
+ configuration no roles for account are necessary)
- add new key for created account and download .json file with credentials
-- share destination folder on the Google Drive with created account (directly in GDrive web application)
-- add new site back in OpenPype Settings, name as you want, provider needs to be 'gdrive'
+- share destination folder on the Google Drive with created account (directly
+ in GDrive web application)
+- add new site back in OpenPype Settings, name as you want, provider needs to
+ be 'gdrive'
- distribute credentials file via shared mounted disk location
:::note
-If you are using regular personal GDrive for testing don't forget adding `/My Drive` as the prefix in root configuration. Business accounts and share drives don't need this.
+If you are using regular personal GDrive for testing don't forget
+adding `/My Drive` as the prefix in root configuration. Business accounts and
+share drives don't need this.
:::
### SFTP
-SFTP provider is used to connect to SFTP server. Currently authentication with `user:password` or `user:ssh key` is implemented.
-Please provide only one combination, don't forget to provide password for ssh key if ssh key was created with a passphrase.
+SFTP provider is used to connect to SFTP server. Currently authentication
+with `user:password` or `user:ssh key` is implemented.
+Please provide only one combination, don't forget to provide password for ssh
+key if ssh key was created with a passphrase.
-(SFTP connection could be a bit finicky, use FileZilla or WinSCP for testing connection, it will be mush faster.)
+(SFTP connection could be a bit finicky, use FileZilla or WinSCP for testing
+connection, it will be mush faster.)
-Beware that ssh key expects OpenSSH format (`.pem`) not a Putty format (`.ppk`)!
+Beware that ssh key expects OpenSSH format (`.pem`) not a Putty
+format (`.ppk`)!
#### How to set SFTP site
@@ -143,60 +197,101 @@ Beware that ssh key expects OpenSSH format (`.pem`) not a Putty format (`.ppk`)!

-- In Projects setting enable Site Sync (on default project - all project will be synched, or on specific project)
-- Configure SFTP connection and destination folder on a SFTP server (in screenshot `/upload`)
+- In Projects setting enable Site Sync (on default project - all project will
+ be synched, or on specific project)
+- Configure SFTP connection and destination folder on a SFTP server (in
+ screenshot `/upload`)

-
-- if you want to force syncing between local and sftp site for all users, use combination `active site: local`, `remote site: NAME_OF_SFTP_SITE`
-- if you want to allow only specific users to use SFTP syncing (external users, not located in the office), use `active site: studio`, `remote site: studio`.
+
+- if you want to force syncing between local and sftp site for all users, use
+ combination `active site: local`, `remote site: NAME_OF_SFTP_SITE`
+- if you want to allow only specific users to use SFTP syncing (external users,
+ not located in the office), use `active site: studio`, `remote site: studio`.

-- Each artist can decide and configure syncing from his/her local to SFTP via `Local Settings`
+- Each artist can decide and configure syncing from his/her local to SFTP
+ via `Local Settings`

-
+
### Custom providers
-If a studio needs to use other services for cloud storage, or want to implement totally different storage providers, they can do so by writing their own provider plugin. We're working on a developer documentation, however, for now we recommend looking at `abstract_provider.py`and `gdrive.py` inside `openpype/modules/sync_server/providers` and using it as a template.
+If a studio needs to use other services for cloud storage, or want to implement
+totally different storage providers, they can do so by writing their own
+provider plugin. We're working on a developer documentation, however, for now
+we recommend looking at `abstract_provider.py`and `gdrive.py`
+inside `openpype/modules/sync_server/providers` and using it as a template.
### Running Site Sync in background
-Site Sync server synchronizes new published files from artist machine into configured remote location by default.
+Site Sync server synchronizes new published files from artist machine into
+configured remote location by default.
-There might be a use case where you need to synchronize between "non-artist" sites, for example between studio site and cloud. In this case
-you need to run Site Sync as a background process from a command line (via service etc) 24/7.
+There might be a use case where you need to synchronize between "non-artist"
+sites, for example between studio site and cloud. In this case
+you need to run Site Sync as a background process from a command line (via
+service etc) 24/7.
-To configure all sites where all published files should be synced eventually you need to configure `project_settings/global/sync_server/config/always_accessible_on` property in Settings (per project) first.
+To configure all sites where all published files should be synced eventually
+you need to
+configure `project_settings/global/sync_server/config/always_accessible_on`
+property in Settings (per project) first.

This is an example of:
+
- Site Sync is enabled for a project
-- default active and remote sites are set to `studio` - eg. standard process: everyone is working in a studio, publishing to shared location etc.
-- (but this also allows any of the artists to work remotely, they would change their active site in their own Local Settings to `local` and configure local root.
- This would result in everything artist publishes is saved first onto his local folder AND synchronized to `studio` site eventually.)
+- default active and remote sites are set to `studio` - eg. standard process:
+ everyone is working in a studio, publishing to shared location etc.
+- (but this also allows any of the artists to work remotely, they would change
+ their active site in their own Local Settings to `local` and configure local
+ root.
+ This would result in everything artist publishes is saved first onto his
+ local folder AND synchronized to `studio` site eventually.)
- everything exported must also be eventually uploaded to `sftp` site
-This eventual synchronization between `studio` and `sftp` sites must be physically handled by background process.
+This eventual synchronization between `studio` and `sftp` sites must be
+physically handled by background process.
-As current implementation relies heavily on Settings and Local Settings, background process for a specific site ('studio' for example) must be configured via Tray first to `syncserver` command to work.
+As current implementation relies heavily on Settings and Local Settings,
+background process for a specific site ('studio' for example) must be
+configured via Tray first to `syncserver` command to work.
To do this:
-- run OP `Tray` with environment variable OPENPYPE_LOCAL_ID set to name of active (source) site. In most use cases it would be studio (for cases of backups of everything published to studio site to different cloud site etc.)
+- run OP `Tray` with environment variable OPENPYPE_LOCAL_ID set to name of
+ active (source) site. In most use cases it would be studio (for cases of
+ backups of everything published to studio site to different cloud site etc.)
- start `Tray`
-- check `Local ID` in information dialog after clicking on version number in the Tray
+- check `Local ID` in information dialog after clicking on version number in
+ the Tray
- open `Local Settings` in the `Tray`
- configure for each project necessary active site and remote site
- close `Tray`
- run OP from a command line with `syncserver` and `--active_site` arguments
-
-This is an example how to trigger background syncing process where active (source) site is `studio`.
-(It is expected that OP is installed on a machine, `openpype_console` is on PATH. If not, add full path to executable.
+This is an example how to trigger background syncing process where active (
+source) site is `studio`.
+(It is expected that OP is installed on a machine, `openpype_console` is on
+PATH. If not, add full path to executable.
)
+
```shell
openpype_console syncserver --active_site studio
-```
\ No newline at end of file
+```
+
+### Syncing of last published workfile
+
+Some DCC might have enabled
+in `project_setting/global/tools/Workfiles/last_workfile_on_startup`, eg. open
+DCC with last opened workfile.
+
+Flag `use_last_published_workfile` tells that last published workfile should be
+used if no workfile is present locally.
+This use case could happen if artists starts working on new task locally,
+doesn't have any workfile present. In that case last published will be
+synchronized locally and its version bumped by 1 (as workfile's version is
+always +1 from published version).
\ No newline at end of file
diff --git a/website/docs/project_settings/settings_project_global.md b/website/docs/project_settings/settings_project_global.md
index 2de9038f3f..c17f707830 100644
--- a/website/docs/project_settings/settings_project_global.md
+++ b/website/docs/project_settings/settings_project_global.md
@@ -255,7 +255,7 @@ suffix is **"client"** then the final suffix is **"h264_client"**.
| resolution_height | Resolution height. |
| fps | Fps of an output. |
| timecode | Timecode by frame start and fps. |
- | focalLength | **Only available in Maya**