to any path where the zip with project is - usually we are having it here https://drive.google.com/drive/u/0/folders/0AKE4mxImOsAGUk9PVA . Copy the file into .\OpenPype\tools. Then use the cmd form .EXAMPLE
+
+.EXAMPLE
+
+PS> .\tools\run_unpack_project.ps1
+
+#>
+$current_dir = Get-Location
+$script_dir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
+$openpype_root = (Get-Item $script_dir).parent.FullName
+
+$env:_INSIDE_OPENPYPE_TOOL = "1"
+
+# make sure Poetry is in PATH
+if (-not (Test-Path 'env:POETRY_HOME')) {
+ $env:POETRY_HOME = "$openpype_root\.poetry"
+}
+$env:PATH = "$($env:PATH);$($env:POETRY_HOME)\bin"
+
+Set-Location -Path $openpype_root
+
+Write-Host ">>> " -NoNewline -ForegroundColor Green
+Write-Host "Reading Poetry ... " -NoNewline
+if (-not (Test-Path -PathType Container -Path "$($env:POETRY_HOME)\bin")) {
+ Write-Host "NOT FOUND" -ForegroundColor Yellow
+ Write-Host "*** " -NoNewline -ForegroundColor Yellow
+ Write-Host "We need to install Poetry create virtual env first ..."
+ & "$openpype_root\tools\create_env.ps1"
+} else {
+ Write-Host "OK" -ForegroundColor Green
+}
+
+& "$($env:POETRY_HOME)\bin\poetry" run python "$($openpype_root)\start.py" unpack-project --zipfile $ARGS
+Set-Location -Path $current_dir
\ No newline at end of file
diff --git a/vendor/powershell/README.md b/vendor/powershell/README.md
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/website/docs/admin_openpype_commands.md b/website/docs/admin_openpype_commands.md
index 53b4799d6e..53fc12410f 100644
--- a/website/docs/admin_openpype_commands.md
+++ b/website/docs/admin_openpype_commands.md
@@ -45,6 +45,7 @@ For more information [see here](admin_use.md#run-openpype).
| publish | Pype takes JSON from provided path and use it to publish data in it. | [📑](#publish-arguments) |
| extractenvironments | Extract environment variables for entered context to a json file. | [📑](#extractenvironments-arguments) |
| run | Execute given python script within OpenPype environment. | [📑](#run-arguments) |
+| interactive | Start python like interactive console session. | |
| projectmanager | Launch Project Manager UI | [📑](#projectmanager-arguments) |
| settings | Open Settings UI | [📑](#settings-arguments) |
| standalonepublisher | Open Standalone Publisher UI | [📑](#standalonepublisher-arguments) |
diff --git a/website/docs/dev_publishing.md b/website/docs/dev_publishing.md
index 8ee3b7e85f..f11a2c3047 100644
--- a/website/docs/dev_publishing.md
+++ b/website/docs/dev_publishing.md
@@ -66,7 +66,7 @@ Another optional function is **get_current_context**. This function is handy in
Main responsibility of create plugin is to create, update, collect and remove instance metadata and propagate changes to create context. Has access to **CreateContext** (`self.create_context`) that discovered the plugin so has also access to other creators and instances. Create plugins have a lot of responsibility so it is recommended to implement common code per host.
#### *BaseCreator*
-Base implementation of creator plugin. It is not recommended to use this class as base for production plugins but rather use one of **AutoCreator** and **Creator** variants.
+Base implementation of creator plugin. It is not recommended to use this class as base for production plugins but rather use one of **HiddenCreator**, **AutoCreator** and **Creator** variants.
**Abstractions**
- **`family`** (class attr) - Tells what kind of instance will be created.
@@ -92,7 +92,7 @@ def collect_instances(self):
self._add_instance_to_context(instance)
```
-- **`create`** (method) - Create a new object of **CreatedInstance** store its metadata to the workfile and add the instance into the created context. Failed Creating should raise **CreatorError** if an error happens that artists can fix or give them some useful information. Triggers and implementation differs for **Creator** and **AutoCreator**.
+- **`create`** (method) - Create a new object of **CreatedInstance** store its metadata to the workfile and add the instance into the created context. Failed Creating should raise **CreatorError** if an error happens that artists can fix or give them some useful information. Triggers and implementation differs for **Creator**, **HiddenCreator** and **AutoCreator**.
- **`update_instances`** (method) - Update data of instances. Receives tuple with **instance** and **changes**.
```python
@@ -172,11 +172,11 @@ class RenderLayerCreator(Creator):
icon = "fa5.building"
```
-- **`get_instance_attr_defs`** (method) - Attribute definitions of instance. Creator can define attribute values with default values for each instance. These attributes may affect how instances will be instance processed during publishing. Attribute defiitions can be used from `openpype.pipeline.lib.attribute_definitions` (NOTE: Will be moved to `openpype.lib.attribute_definitions` soon). Attribute definitions define basic types of values for different cases e.g. boolean, number, string, enumerator, etc. Default implementation returns **instance_attr_defs**.
+- **`get_instance_attr_defs`** (method) - Attribute definitions of instance. Creator can define attribute values with default values for each instance. These attributes may affect how instances will be instance processed during publishing. Attribute defiitions can be used from `openpype.lib.attribute_definitions`. Attribute definitions define basic types of values for different cases e.g. boolean, number, string, enumerator, etc. Default implementation returns **instance_attr_defs**.
- **`instance_attr_defs`** (attr) - Attribute for default implementation of **get_instance_attr_defs**.
```python
-from openpype.pipeline import attribute_definitions
+from openpype.lib import attribute_definitions
class RenderLayerCreator(Creator):
@@ -199,6 +199,20 @@ class RenderLayerCreator(Creator):
- **`get_dynamic_data`** (method) - Can be used to extend data for subset templates which may be required in some cases.
+#### *HiddenCreator*
+Creator which is not showed in UI so artist can't trigger it directly but is available for other creators. This creator is primarily meant for cases when creation should create different types of instances. For example during editorial publishing where input is single edl file but should create 2 or more kind of instances each with different family, attributes and abilities. Arguments for creation were limited to `instance_data` and `source_data`. Data of `instance_data` should follow what is sent to other creators and `source_data` can be used to send custom data defined by main creator. It is expected that `HiddenCreator` has specific main or "parent" creator.
+
+```python
+def create(self, instance_data, source_data):
+ variant = instance_data["variant"]
+ task_name = instance_data["task"]
+ asset_name = instance_data["asset"]
+ asset_doc = get_asset_by_name(self.project_name, asset_name)
+ self.get_subset_name(
+ variant, task_name, asset_doc, self.project_name, self.host_name)
+```
+
+
#### *AutoCreator*
Creator that is triggered on reset of create context. Can be used for families that are expected to be created automatically without artist interaction (e.g. **workfile**). Method `create` is triggered after collecting all creators.
@@ -234,14 +248,14 @@ def create(self):
# - variant can be filled from settings
variant = self._variant_name
# Only place where we can look for current context
- project_name = io.Session["AVALON_PROJECT"]
- asset_name = io.Session["AVALON_ASSET"]
- task_name = io.Session["AVALON_TASK"]
- host_name = io.Session["AVALON_APP"]
+ project_name = self.project_name
+ asset_name = legacy_io.Session["AVALON_ASSET"]
+ task_name = legacy_io.Session["AVALON_TASK"]
+ host_name = legacy_io.Session["AVALON_APP"]
# Create new instance if does not exist yet
if existing_instance is None:
- asset_doc = io.find_one({"type": "asset", "name": asset_name})
+ asset_doc = get_asset_by_name(project_name, asset_name)
subset_name = self.get_subset_name(
variant, task_name, asset_doc, project_name, host_name
)
@@ -264,7 +278,7 @@ def create(self):
existing_instance["asset"] != asset_name
or existing_instance["task"] != task_name
):
- asset_doc = io.find_one({"type": "asset", "name": asset_name})
+ asset_doc = get_asset_by_name(project_name, asset_name)
subset_name = self.get_subset_name(
variant, task_name, asset_doc, project_name, host_name
)
@@ -297,7 +311,8 @@ class BulkRenderCreator(Creator):
- **`pre_create_attr_defs`** (attr) - Attribute for default implementation of **get_pre_create_attr_defs**.
```python
-from openpype.pipeline import Creator, attribute_definitions
+from openpype.lib import attribute_definitions
+from openpype.pipeline.create import Creator
class CreateRender(Creator):
@@ -470,10 +485,8 @@ Possible attribute definitions can be found in `openpype/pipeline/lib/attribute_
```python
import pyblish.api
-from openpype.pipeline import (
- OpenPypePyblishPluginMixin,
- attribute_definitions,
-)
+from openpype.lib import attribute_definitions
+from openpype.pipeline import OpenPypePyblishPluginMixin
# Example context plugin
diff --git a/website/src/css/custom.css b/website/src/css/custom.css
index e8dd86256b..58c9305bc7 100644
--- a/website/src/css/custom.css
+++ b/website/src/css/custom.css
@@ -196,12 +196,12 @@ html[data-theme='dark'] .header-github-link::before {
padding: 20px
}
-.showcase .client {
+.showcase .studio {
display: flex;
justify-content: space-between;
}
-.showcase .client img {
+.showcase .studio img {
max-height: 110px;
padding: 20px;
max-width: 160px;
diff --git a/website/src/pages/index.js b/website/src/pages/index.js
index 0886706015..52302ec285 100644
--- a/website/src/pages/index.js
+++ b/website/src/pages/index.js
@@ -65,13 +65,17 @@ const collab = [
image: '/img/clothcat.png',
infoLink: 'https://www.clothcatanimation.com/'
}, {
- title: 'Ellipse Studio',
- image: '/img/ellipse-studio.png',
- infoLink: 'http://www.dargaudmedia.com'
+ title: 'Ellipse Animation',
+ image: '/img/ellipse_animation.svg',
+ infoLink: 'http://www.ellipseanimation.com'
}, {
title: 'J Cube Inc',
image: '/img/jcube_logo_bw.png',
infoLink: 'https://j-cube.jp'
+ }, {
+ title: 'Normaal Animation',
+ image: '/img/logo_normaal.png',
+ infoLink: 'https://j-cube.jp'
}
];
@@ -153,7 +157,32 @@ const studios = [
title: "IGG Canada",
image: "/img/igg-logo.png",
infoLink: "https://www.igg.com/",
- }
+ },
+ {
+ title: "Agora Studio",
+ image: "/img/agora_studio.png",
+ infoLink: "https://agora.studio/",
+ },
+ {
+ title: "Lucan Visuals",
+ image: "/img/lucan_Logo_On_White-HR.png",
+ infoLink: "https://www.lucan.tv/",
+ },
+ {
+ title: "No Ghost",
+ image: "/img/noghost.png",
+ infoLink: "https://www.noghost.co.uk/",
+ },
+ {
+ title: "Static VFX",
+ image: "/img/staticvfx.png",
+ infoLink: "http://www.staticvfx.com/",
+ },
+ {
+ title: "Method n Madness",
+ image: "/img/methodmadness.png",
+ infoLink: "https://www.methodnmadness.com/",
+}
];
function Service({imageUrl, title, description}) {
@@ -166,10 +195,10 @@ function Service({imageUrl, title, description}) {
);
}
-function Client({title, image, infoLink}) {
+function Studio({title, image, infoLink}) {
const imgUrl = useBaseUrl(image);
return (
-
+
);
@@ -465,7 +494,7 @@ function Home() {
Studios using openPype
{studios.map((props, idx) => (
-
+
))}
diff --git a/website/static/img/NoGhost_Logo_black.svg b/website/static/img/NoGhost_Logo_black.svg
new file mode 100644
index 0000000000..b499b1621f
--- /dev/null
+++ b/website/static/img/NoGhost_Logo_black.svg
@@ -0,0 +1,31 @@
+
+
+
diff --git a/website/static/img/agora_studio.png b/website/static/img/agora_studio.png
new file mode 100644
index 0000000000..48b07b8775
Binary files /dev/null and b/website/static/img/agora_studio.png differ
diff --git a/website/static/img/ellipse_animation.svg b/website/static/img/ellipse_animation.svg
new file mode 100644
index 0000000000..c1caaa6726
--- /dev/null
+++ b/website/static/img/ellipse_animation.svg
@@ -0,0 +1,9 @@
+
diff --git a/website/static/img/igg-logo.png b/website/static/img/igg-logo.png
index 3c7f7718f7..9fc7a7f84f 100644
Binary files a/website/static/img/igg-logo.png and b/website/static/img/igg-logo.png differ
diff --git a/website/static/img/logo_normaal.png b/website/static/img/logo_normaal.png
new file mode 100644
index 0000000000..711847c9f2
Binary files /dev/null and b/website/static/img/logo_normaal.png differ
diff --git a/website/static/img/lucan_Logo_On_White-HR.png b/website/static/img/lucan_Logo_On_White-HR.png
new file mode 100644
index 0000000000..c86030e1e7
Binary files /dev/null and b/website/static/img/lucan_Logo_On_White-HR.png differ
diff --git a/website/static/img/methodmadness.png b/website/static/img/methodmadness.png
new file mode 100644
index 0000000000..9dd0681d4a
Binary files /dev/null and b/website/static/img/methodmadness.png differ
diff --git a/website/static/img/noghost.png b/website/static/img/noghost.png
new file mode 100644
index 0000000000..febaedcae8
Binary files /dev/null and b/website/static/img/noghost.png differ
diff --git a/website/static/img/staticvfx.png b/website/static/img/staticvfx.png
new file mode 100644
index 0000000000..41efd7f120
Binary files /dev/null and b/website/static/img/staticvfx.png differ