diff --git a/CHANGELOG.md b/CHANGELOG.md index f0489eff..86e81458 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,36 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [1.3.1] - 2024-12-20 + +### Added +- example script to assemble face rig in Maya with textures `dna_viewer_build_rig_with_textures.py` +- added support for Maya 2024 in dna_calibration.mod file + +## [1.3.0] - 2024-08-15 + +### Added +- support for Maya 2024 +- support for Python 3.10 +- added source code comments to python wrappers + +### Fixed +- `CalculateMeshLowerLODsCommand` was rewritten to address edge cases discovered with eye lashes and to handle some common cases of invalid UV data. +- `RotateCommand` to rotate blend shape target deltas as well. +- `SetBlendShapeTargetDeltasCommand` to allow setting vertex indices as well. +- Swig generated classes are now wrapped instead of being monkey-patched to invoke constructors and destructors (which allows building with newer Swig versions - 4.0.x and 4.1.x). + +### Changed +- CMake files to add test cases that execute the example scripts and allow generating bundled archives with CPack. +- Binaries for embeddedRL4 plugin to be .so files. + + +## [1.2.0] - 2023-06-30 + +### Added +- assets (gui.ma, Ada.dna, additional_assemble_script.py) which support MHC 2.x.x releases (UE 5.2 and 5.3) + + ## [1.1.0] - 2023-04-20 ### Added @@ -26,4 +56,4 @@ All notable changes to this project will be documented in this file. This projec - option to pass list of indices to remove in remove commands. ### Removed -- removed method `assemble_rig` from DNAViewer API. \ No newline at end of file +- removed method `assemble_rig` from DNAViewer API. diff --git a/README.md b/README.md index 1a644a2f..4a6434da 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ Several Python examples are provided for reference and can be found in the **exa - [Generates rig](/examples/dna_viewer_build_rig.py) - [Export FBX per LOD](/examples/dna_viewer_export_fbx.py) - [Propagating changes from Maya scene to dna](/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py) +- [Generate face rig with textures](/examples/dna_viewer_build_rig_with_textures.py) Note: Examples are grouped in three groups: DNA, DNACalib, and DNAViewer. These names are embedded as prefixes: dna_, dnacalib_, and dna_viewer_. @@ -171,7 +172,7 @@ else: ``` # Notes -If a user runs examples in Maya 2022, the value for `ROOT_DIR` should be changed and absolute paths must be used, +If a user runs examples in Maya, the value for `ROOT_DIR` should be changed and absolute paths must be used, e.g. `c:/MetaHuman-DNA-Calibration` in Windows or `/home/user/MetaHuman-DNA-Calibration` in Linux. Important: Use `/` (forward slash), Maya uses forward slashes in path. See the [FAQ guide](docs/faq.md) for additional specifications. diff --git a/UnrealFest.zip b/UnrealFest.zip new file mode 100644 index 00000000..b166e5dd Binary files /dev/null and b/UnrealFest.zip differ diff --git a/data/lights.ma b/data/lights.ma new file mode 100644 index 00000000..c8707a59 --- /dev/null +++ b/data/lights.ma @@ -0,0 +1,526 @@ +//Maya ASCII 2018ff09 scene +//Name: dh_lights.ma +//Last modified: Thu, May 11, 2023 11:07:06 AM +//Codeset: 1252 +requires maya "2018ff09"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2018"; +fileInfo "version" "2018"; +fileInfo "cutIdentifier" "201903222215-65bada0e52"; +fileInfo "osv" "Microsoft Windows 8 Enterprise Edition, 64-bit (Build 9200)\n"; +createNode transform -s -n "persp"; + rename -uid "7BE03783-4E24-89B6-5989-A493C66637E0"; + setAttr ".v" no; + setAttr ".t" -type "double3" 30.386393925746596 164.46424883057017 220.93384230676068 ; + setAttr ".r" -type "double3" -4.5383527322844488 364.60000000001168 2.4928380793358483e-17 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "17C4DE2D-4474-6D71-CB6F-6A8339904880"; + setAttr -k off ".v" no; + setAttr ".fl" 70; + setAttr ".coi" 235.22766075984245; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".tp" -type "double3" 5.2474091943811381 153.18041361778683 22.081981913115726 ; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "31146484-4292-2309-297F-65BEAF59D272"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "57F36015-479F-8693-E5D7-258FDB082AAA"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + rename -uid "D49E1F9F-45C5-21B5-FBA0-1489D48D157A"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "C0399F30-4794-526C-41BE-12864024BA2D"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + rename -uid "F8B47EFF-46B3-66B0-A1E0-928C7E024511"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "1A18B0B0-4597-714D-E72F-DDA863A6711A"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "Lights"; + rename -uid "BC495762-4E8D-5F2A-7844-19883889F5F0"; + setAttr ".t" -type "double3" -9.1321692712715037e-15 0 0 ; +createNode transform -n "directionalLight1" -p "Lights"; + rename -uid "65DA2872-436B-EDD6-1D2D-E6BFF59299BC"; + setAttr ".t" -type "double3" 15.486014481397302 138.81235271383406 5.2714390949948786 ; + setAttr ".r" -type "double3" -116.515 10.116 -98.348000000000013 ; +createNode directionalLight -n "directionalLightShape1" -p "directionalLight1"; + rename -uid "36B42BE7-4800-2440-AF1C-E980D1CC87BF"; + setAttr -k off ".v"; + setAttr ".cl" -type "float3" 0.49200001 0.74699998 0.72899997 ; + setAttr ".urs" no; + setAttr ".dms" yes; + setAttr ".dr" 1280; +createNode transform -n "directionalLight2" -p "Lights"; + rename -uid "7323F264-4461-0429-2501-FAB17160A35E"; + setAttr ".t" -type "double3" 20.940014481397302 138.81235271383406 5.2714390949948786 ; + setAttr ".r" -type "double3" 25.053 -21.159 -133.766 ; +createNode directionalLight -n "directionalLightShape2" -p "directionalLight2"; + rename -uid "674147DA-41B9-DF32-387E-81AD128B5F70"; + setAttr -k off ".v"; + setAttr ".cl" -type "float3" 0.71764708 0.86666667 0.90196079 ; + setAttr ".in" 1.1449999809265137; + setAttr ".urs" no; + setAttr ".dms" yes; + setAttr ".dr" 1280; +createNode transform -n "directionalLight3" -p "Lights"; + rename -uid "FEE50C1F-498A-CA90-4D71-E1BCF3CC7285"; + setAttr ".t" -type "double3" 18.166014481397301 138.81235271383406 5.2714390949948786 ; + setAttr ".r" -type "double3" -136.209 46.468 55.503 ; +createNode directionalLight -n "directionalLightShape3" -p "directionalLight3"; + rename -uid "0FDD36F9-46DC-9CD8-95F3-0584EE829681"; + setAttr -k off ".v"; + setAttr ".cl" -type "float3" 0.57647061 0.8509804 0.9137255 ; + setAttr ".in" 0.7929999828338623; + setAttr ".urs" no; + setAttr ".dms" yes; + setAttr ".dr" 1280; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "164B5954-4F38-1CA6-4626-8BB06933E9DC"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; + rename -uid "F5E9D64D-4FD6-EEA8-5D5E-6B9518D7E895"; +createNode displayLayer -n "defaultLayer"; + rename -uid "F8BF08C2-4846-CFBF-91C2-E580763F662F"; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "7F55B5EA-488C-8D40-BE39-5496C9D71AF3"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "48CE02BC-4D67-7414-65B5-1089007AFCE7"; + setAttr ".g" yes; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "8418F3FA-4979-1AF9-5770-6498EFF21B86"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n" + + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n" + + " -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n" + + " -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n" + + " -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n" + + " -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1319\n -height 626\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n" + + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" + + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -selectCommand \"\" \n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 1\n" + + " -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n" + + " -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 1\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n" + + " -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n" + + " -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -autoFitTime 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n" + + " -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 0\n -outliner \"graphEditor1OutlineEd\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 1\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n" + + " -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"integer\" \n -snapValue \"none\" \n" + + " -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n" + + " -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n" + + " -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n" + + " -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -image \"C:/work/Batman/characters/Bane/sourceimages/Bane_tpage_2048.tga\" \n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n" + + "\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n" + + " -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -editorMode \"default\" \n" + + " $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n" + + " -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -editorMode \"default\" \n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\n" + + "string $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -editorChanged \"updateModelPanelBar\" \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n" + + " -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererOverrideName \"stereoOverrideVP2\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n" + + " -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n" + + " -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n" + + " -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n" + + " -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -selectCommand \"pass\" \n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n" + + " string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -docTag \\\"RADRENDER\\\" \\n -editorChanged \\\"updateModelPanelBar\\\" \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1319\\n -height 626\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -docTag \\\"RADRENDER\\\" \\n -editorChanged \\\"updateModelPanelBar\\\" \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1319\\n -height 626\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "55EEE3F8-4EE1-A60E-BD11-499251DB7F72"; + addAttr -ci true -m -sn "stringOptions" -ln "stringOptions" -at "compound" -nc + 3; + addAttr -ci true -sn "name" -ln "name" -dt "string" -p "stringOptions"; + addAttr -ci true -sn "value" -ln "value" -dt "string" -p "stringOptions"; + addAttr -ci true -sn "type" -ln "type" -dt "string" -p "stringOptions"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; + setAttr ".st" 6; + setAttr -s 48 ".stringOptions"; + setAttr ".stringOptions[0].name" -type "string" "rast motion factor"; + setAttr ".stringOptions[0].value" -type "string" "1.0"; + setAttr ".stringOptions[0].type" -type "string" "scalar"; + setAttr ".stringOptions[1].name" -type "string" "rast transparency depth"; + setAttr ".stringOptions[1].value" -type "string" "8"; + setAttr ".stringOptions[1].type" -type "string" "integer"; + setAttr ".stringOptions[2].name" -type "string" "rast useopacity"; + setAttr ".stringOptions[2].value" -type "string" "true"; + setAttr ".stringOptions[2].type" -type "string" "boolean"; + setAttr ".stringOptions[3].name" -type "string" "importon"; + setAttr ".stringOptions[3].value" -type "string" "false"; + setAttr ".stringOptions[3].type" -type "string" "boolean"; + setAttr ".stringOptions[4].name" -type "string" "importon density"; + setAttr ".stringOptions[4].value" -type "string" "1.0"; + setAttr ".stringOptions[4].type" -type "string" "scalar"; + setAttr ".stringOptions[5].name" -type "string" "importon merge"; + setAttr ".stringOptions[5].value" -type "string" "0.0"; + setAttr ".stringOptions[5].type" -type "string" "scalar"; + setAttr ".stringOptions[6].name" -type "string" "importon trace depth"; + setAttr ".stringOptions[6].value" -type "string" "0"; + setAttr ".stringOptions[6].type" -type "string" "integer"; + setAttr ".stringOptions[7].name" -type "string" "importon traverse"; + setAttr ".stringOptions[7].value" -type "string" "true"; + setAttr ".stringOptions[7].type" -type "string" "boolean"; + setAttr ".stringOptions[8].name" -type "string" "shadowmap pixel samples"; + setAttr ".stringOptions[8].value" -type "string" "3"; + setAttr ".stringOptions[8].type" -type "string" "integer"; + setAttr ".stringOptions[9].name" -type "string" "ambient occlusion"; + setAttr ".stringOptions[9].value" -type "string" "false"; + setAttr ".stringOptions[9].type" -type "string" "boolean"; + setAttr ".stringOptions[10].name" -type "string" "ambient occlusion rays"; + setAttr ".stringOptions[10].value" -type "string" "64"; + setAttr ".stringOptions[10].type" -type "string" "integer"; + setAttr ".stringOptions[11].name" -type "string" "ambient occlusion cache"; + setAttr ".stringOptions[11].value" -type "string" "false"; + setAttr ".stringOptions[11].type" -type "string" "boolean"; + setAttr ".stringOptions[12].name" -type "string" "ambient occlusion cache density"; + setAttr ".stringOptions[12].value" -type "string" "1.0"; + setAttr ".stringOptions[12].type" -type "string" "scalar"; + setAttr ".stringOptions[13].name" -type "string" "ambient occlusion cache points"; + setAttr ".stringOptions[13].value" -type "string" "64"; + setAttr ".stringOptions[13].type" -type "string" "integer"; + setAttr ".stringOptions[14].name" -type "string" "irradiance particles"; + setAttr ".stringOptions[14].value" -type "string" "false"; + setAttr ".stringOptions[14].type" -type "string" "boolean"; + setAttr ".stringOptions[15].name" -type "string" "irradiance particles rays"; + setAttr ".stringOptions[15].value" -type "string" "256"; + setAttr ".stringOptions[15].type" -type "string" "integer"; + setAttr ".stringOptions[16].name" -type "string" "irradiance particles interpolate"; + setAttr ".stringOptions[16].value" -type "string" "1"; + setAttr ".stringOptions[16].type" -type "string" "integer"; + setAttr ".stringOptions[17].name" -type "string" "irradiance particles interppoints"; + setAttr ".stringOptions[17].value" -type "string" "64"; + setAttr ".stringOptions[17].type" -type "string" "integer"; + setAttr ".stringOptions[18].name" -type "string" "irradiance particles indirect passes"; + setAttr ".stringOptions[18].value" -type "string" "0"; + setAttr ".stringOptions[18].type" -type "string" "integer"; + setAttr ".stringOptions[19].name" -type "string" "irradiance particles scale"; + setAttr ".stringOptions[19].value" -type "string" "1.0"; + setAttr ".stringOptions[19].type" -type "string" "scalar"; + setAttr ".stringOptions[20].name" -type "string" "irradiance particles env"; + setAttr ".stringOptions[20].value" -type "string" "true"; + setAttr ".stringOptions[20].type" -type "string" "boolean"; + setAttr ".stringOptions[21].name" -type "string" "irradiance particles env rays"; + setAttr ".stringOptions[21].value" -type "string" "256"; + setAttr ".stringOptions[21].type" -type "string" "integer"; + setAttr ".stringOptions[22].name" -type "string" "irradiance particles env scale"; + setAttr ".stringOptions[22].value" -type "string" "1"; + setAttr ".stringOptions[22].type" -type "string" "integer"; + setAttr ".stringOptions[23].name" -type "string" "irradiance particles rebuild"; + setAttr ".stringOptions[23].value" -type "string" "true"; + setAttr ".stringOptions[23].type" -type "string" "boolean"; + setAttr ".stringOptions[24].name" -type "string" "irradiance particles file"; + setAttr ".stringOptions[24].value" -type "string" ""; + setAttr ".stringOptions[24].type" -type "string" "string"; + setAttr ".stringOptions[25].name" -type "string" "geom displace motion factor"; + setAttr ".stringOptions[25].value" -type "string" "1.0"; + setAttr ".stringOptions[25].type" -type "string" "scalar"; + setAttr ".stringOptions[26].name" -type "string" "contrast all buffers"; + setAttr ".stringOptions[26].value" -type "string" "true"; + setAttr ".stringOptions[26].type" -type "string" "boolean"; + setAttr ".stringOptions[27].name" -type "string" "finalgather normal tolerance"; + setAttr ".stringOptions[27].value" -type "string" "25.842"; + setAttr ".stringOptions[27].type" -type "string" "scalar"; + setAttr ".stringOptions[28].name" -type "string" "trace camera clip"; + setAttr ".stringOptions[28].value" -type "string" "false"; + setAttr ".stringOptions[28].type" -type "string" "boolean"; + setAttr ".stringOptions[29].name" -type "string" "unified sampling"; + setAttr ".stringOptions[29].value" -type "string" "true"; + setAttr ".stringOptions[29].type" -type "string" "boolean"; + setAttr ".stringOptions[30].name" -type "string" "samples quality"; + setAttr ".stringOptions[30].value" -type "string" "0.25 0.25 0.25 0.25"; + setAttr ".stringOptions[30].type" -type "string" "color"; + setAttr ".stringOptions[31].name" -type "string" "samples min"; + setAttr ".stringOptions[31].value" -type "string" "1.0"; + setAttr ".stringOptions[31].type" -type "string" "scalar"; + setAttr ".stringOptions[32].name" -type "string" "samples max"; + setAttr ".stringOptions[32].value" -type "string" "100.0"; + setAttr ".stringOptions[32].type" -type "string" "scalar"; + setAttr ".stringOptions[33].name" -type "string" "samples error cutoff"; + setAttr ".stringOptions[33].value" -type "string" "0.0 0.0 0.0 0.0"; + setAttr ".stringOptions[33].type" -type "string" "color"; + setAttr ".stringOptions[34].name" -type "string" "samples per object"; + setAttr ".stringOptions[34].value" -type "string" "false"; + setAttr ".stringOptions[34].type" -type "string" "boolean"; + setAttr ".stringOptions[35].name" -type "string" "progressive"; + setAttr ".stringOptions[35].value" -type "string" "false"; + setAttr ".stringOptions[35].type" -type "string" "boolean"; + setAttr ".stringOptions[36].name" -type "string" "progressive max time"; + setAttr ".stringOptions[36].value" -type "string" "0"; + setAttr ".stringOptions[36].type" -type "string" "integer"; + setAttr ".stringOptions[37].name" -type "string" "progressive subsampling size"; + setAttr ".stringOptions[37].value" -type "string" "4"; + setAttr ".stringOptions[37].type" -type "string" "integer"; + setAttr ".stringOptions[38].name" -type "string" "iray"; + setAttr ".stringOptions[38].value" -type "string" "false"; + setAttr ".stringOptions[38].type" -type "string" "boolean"; + setAttr ".stringOptions[39].name" -type "string" "light relative scale"; + setAttr ".stringOptions[39].value" -type "string" "0.31831"; + setAttr ".stringOptions[39].type" -type "string" "scalar"; + setAttr ".stringOptions[40].name" -type "string" "trace camera motion vectors"; + setAttr ".stringOptions[40].value" -type "string" "false"; + setAttr ".stringOptions[40].type" -type "string" "boolean"; + setAttr ".stringOptions[41].name" -type "string" "ray differentials"; + setAttr ".stringOptions[41].value" -type "string" "true"; + setAttr ".stringOptions[41].type" -type "string" "boolean"; + setAttr ".stringOptions[42].name" -type "string" "environment lighting mode"; + setAttr ".stringOptions[42].value" -type "string" "off"; + setAttr ".stringOptions[42].type" -type "string" "string"; + setAttr ".stringOptions[43].name" -type "string" "environment lighting quality"; + setAttr ".stringOptions[43].value" -type "string" "0.2"; + setAttr ".stringOptions[43].type" -type "string" "scalar"; + setAttr ".stringOptions[44].name" -type "string" "environment lighting shadow"; + setAttr ".stringOptions[44].value" -type "string" "transparent"; + setAttr ".stringOptions[44].type" -type "string" "string"; + setAttr ".stringOptions[45].name" -type "string" "environment lighting resolution"; + setAttr ".stringOptions[45].value" -type "string" "512"; + setAttr ".stringOptions[45].type" -type "string" "integer"; + setAttr ".stringOptions[46].name" -type "string" "environment lighting shader samples"; + setAttr ".stringOptions[46].value" -type "string" "2"; + setAttr ".stringOptions[46].type" -type "string" "integer"; + setAttr ".stringOptions[47].name" -type "string" "environment lighting scale"; + setAttr ".stringOptions[47].value" -type "string" "1.0 1.0 1.0"; + setAttr ".stringOptions[47].type" -type "string" "color"; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "C1A4E002-4B00-921F-6C36-E7981109BC70"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "0A7A777B-42BC-EFFC-F4FB-ECB6E726E530"; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo"; + rename -uid "A959A99A-4D35-3DA7-D5AD-E39C23F21339"; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -330.95236780151544 -323.80951094248991 ; + setAttr ".tgi[0].vh" -type "double2" 317.85713022663526 338.09522466054096 ; +select -ne :time1; + setAttr -av -k on ".cch"; + setAttr -k on ".fzn"; + setAttr -av -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".o" 1; + setAttr -av -k on ".unw" 1; + setAttr -av -k on ".etw"; + setAttr -av -k on ".tps"; + setAttr -av -k on ".tms"; +select -ne :hardwareRenderingGlobals; + setAttr -av -k on ".cch"; + setAttr -av -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 ; + setAttr -k on ".hwi"; + setAttr -av ".ta"; + setAttr -av ".tq"; + setAttr -av ".etmr" no; + setAttr -av ".tmr" 4096; + setAttr -av ".aoon"; + setAttr -av ".aoam"; + setAttr -av ".aora"; + setAttr -k on ".hff"; + setAttr -av -k on ".hfd"; + setAttr -av -k on ".hfs"; + setAttr -av -k on ".hfe"; + setAttr -av ".hfc"; + setAttr -av -k on ".hfcr"; + setAttr -av -k on ".hfcg"; + setAttr -av -k on ".hfcb"; + setAttr -av -k on ".hfa"; + setAttr -av ".mbe"; + setAttr -av -k on ".mbsof"; + setAttr -k on ".blen"; + setAttr -k on ".blat"; + setAttr -av ".msaa"; +select -ne :renderPartition; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".st"; + setAttr -cb on ".an"; + setAttr -cb on ".pt"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 4 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -k on ".ihi"; +select -ne :lightList1; + setAttr -s 3 ".l"; +select -ne :initialShadingGroup; + setAttr -av -k on ".cch"; + setAttr -k on ".fzn"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".bbx"; + setAttr -k on ".vwm"; + setAttr -k on ".tpv"; + setAttr -k on ".uit"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +select -ne :initialParticleSE; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +lockNode -l 0 -lu 1; +select -ne :defaultResolution; + setAttr -av -k on ".cch"; + setAttr -av -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -av -k on ".w"; + setAttr -av -k on ".h"; + setAttr -av -k on ".pa" 1; + setAttr -av -k on ".al"; + setAttr -av -k on ".dar"; + setAttr -av -k on ".ldar"; + setAttr -av -k on ".dpi"; + setAttr -av -k on ".off"; + setAttr -av -k on ".fld"; + setAttr -av -k on ".zsl"; + setAttr -av -k on ".isu"; + setAttr -av -k on ".pdu"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -s 3 ".dsm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr -k on ".ro"; +select -ne :hardwareRenderGlobals; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -av -k off -cb on ".ctrs" 256; + setAttr -av -k off -cb on ".btrs" 512; + setAttr -av -k off -cb on ".fbfm"; + setAttr -av -k off -cb on ".ehql"; + setAttr -av -k off -cb on ".eams"; + setAttr -av -k off -cb on ".eeaa"; + setAttr -av -k off -cb on ".engm"; + setAttr -av -k off -cb on ".mes"; + setAttr -av -k off -cb on ".emb"; + setAttr -av -k off -cb on ".mbbf"; + setAttr -av -k off -cb on ".mbs"; + setAttr -av -k off -cb on ".trm"; + setAttr -av -k off -cb on ".tshc"; + setAttr -av -k off -cb on ".enpt"; + setAttr -av -k off -cb on ".clmt"; + setAttr -av -k off -cb on ".tcov"; + setAttr -av -k off -cb on ".lith"; + setAttr -av -k off -cb on ".sobc"; + setAttr -av -k off -cb on ".cuth"; + setAttr -av -k off -cb on ".hgcd"; + setAttr -av -k off -cb on ".hgci"; + setAttr -av -k off -cb on ".mgcs"; + setAttr -av -k off -cb on ".twa"; + setAttr -av -k off -cb on ".twz"; + setAttr -cb on ".hwcc"; + setAttr -cb on ".hwdp"; + setAttr -cb on ".hwql"; + setAttr -k on ".hwfr"; + setAttr -k on ".soll"; + setAttr -k on ".sosl"; + setAttr -k on ".bswa"; + setAttr -k on ".shml"; + setAttr -k on ".hwel"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "directionalLightShape1.ltd" ":lightList1.l" -na; +connectAttr "directionalLightShape2.ltd" ":lightList1.l" -na; +connectAttr "directionalLightShape3.ltd" ":lightList1.l" -na; +connectAttr ":perspShape.msg" ":defaultRenderGlobals.sc"; +connectAttr "directionalLight1.iog" ":defaultLightSet.dsm" -na; +connectAttr "directionalLight2.iog" ":defaultLightSet.dsm" -na; +connectAttr "directionalLight3.iog" ":defaultLightSet.dsm" -na; +// End of dh_lights.ma diff --git a/data/maps/dx11_diffuseIrradiance_map.dds b/data/maps/dx11_diffuseIrradiance_map.dds new file mode 100644 index 00000000..96bbf929 Binary files /dev/null and b/data/maps/dx11_diffuseIrradiance_map.dds differ diff --git a/data/maps/dx11_jitter_map.tga b/data/maps/dx11_jitter_map.tga new file mode 100644 index 00000000..40ee6bb5 Binary files /dev/null and b/data/maps/dx11_jitter_map.tga differ diff --git a/data/maps/dx11_skinLUT_map.tga b/data/maps/dx11_skinLUT_map.tga new file mode 100644 index 00000000..cf79becb Binary files /dev/null and b/data/maps/dx11_skinLUT_map.tga differ diff --git a/data/maps/dx11_specularIrradiance_map.dds b/data/maps/dx11_specularIrradiance_map.dds new file mode 100644 index 00000000..822e9499 Binary files /dev/null and b/data/maps/dx11_specularIrradiance_map.dds differ diff --git a/data/maps/eyelashes_color_map.tga b/data/maps/eyelashes_color_map.tga new file mode 100644 index 00000000..24f06c35 Binary files /dev/null and b/data/maps/eyelashes_color_map.tga differ diff --git a/data/maps/eyes_color_map.tga b/data/maps/eyes_color_map.tga new file mode 100644 index 00000000..b788b607 Binary files /dev/null and b/data/maps/eyes_color_map.tga differ diff --git a/data/maps/eyes_normal_map.tga b/data/maps/eyes_normal_map.tga new file mode 100644 index 00000000..cd74555a Binary files /dev/null and b/data/maps/eyes_normal_map.tga differ diff --git a/data/maps/head_cavity_map.tga b/data/maps/head_cavity_map.tga new file mode 100644 index 00000000..b0347339 Binary files /dev/null and b/data/maps/head_cavity_map.tga differ diff --git a/data/maps/head_cm1_color_map.tga b/data/maps/head_cm1_color_map.tga new file mode 100644 index 00000000..7dcae9dd Binary files /dev/null and b/data/maps/head_cm1_color_map.tga differ diff --git a/data/maps/head_cm2_color_map.tga b/data/maps/head_cm2_color_map.tga new file mode 100644 index 00000000..019bab3d Binary files /dev/null and b/data/maps/head_cm2_color_map.tga differ diff --git a/data/maps/head_cm3_color_map.tga b/data/maps/head_cm3_color_map.tga new file mode 100644 index 00000000..5ebabc7d Binary files /dev/null and b/data/maps/head_cm3_color_map.tga differ diff --git a/data/maps/head_color_map.tga b/data/maps/head_color_map.tga new file mode 100644 index 00000000..156e746b Binary files /dev/null and b/data/maps/head_color_map.tga differ diff --git a/data/maps/head_micro_normal_map.tga b/data/maps/head_micro_normal_map.tga new file mode 100644 index 00000000..dbd77d32 Binary files /dev/null and b/data/maps/head_micro_normal_map.tga differ diff --git a/data/maps/head_normal_map.tga b/data/maps/head_normal_map.tga new file mode 100644 index 00000000..b9314701 Binary files /dev/null and b/data/maps/head_normal_map.tga differ diff --git a/data/maps/head_roughness_map.tga b/data/maps/head_roughness_map.tga new file mode 100644 index 00000000..9d9545a0 Binary files /dev/null and b/data/maps/head_roughness_map.tga differ diff --git a/data/maps/head_wm1_normal_map.tga b/data/maps/head_wm1_normal_map.tga new file mode 100644 index 00000000..88af2124 Binary files /dev/null and b/data/maps/head_wm1_normal_map.tga differ diff --git a/data/maps/head_wm2_normal_map.tga b/data/maps/head_wm2_normal_map.tga new file mode 100644 index 00000000..b0111781 Binary files /dev/null and b/data/maps/head_wm2_normal_map.tga differ diff --git a/data/maps/head_wm3_normal_map.tga b/data/maps/head_wm3_normal_map.tga new file mode 100644 index 00000000..3961a9c0 Binary files /dev/null and b/data/maps/head_wm3_normal_map.tga differ diff --git a/data/maps/teeth_color_map.tga b/data/maps/teeth_color_map.tga new file mode 100644 index 00000000..0c4155d5 Binary files /dev/null and b/data/maps/teeth_color_map.tga differ diff --git a/data/maps/teeth_normal_map.tga b/data/maps/teeth_normal_map.tga new file mode 100644 index 00000000..e90f38c9 Binary files /dev/null and b/data/maps/teeth_normal_map.tga differ diff --git a/data/masks/head_wm13_lips_DL_msk.tga b/data/masks/head_wm13_lips_DL_msk.tga new file mode 100644 index 00000000..03d954c3 Binary files /dev/null and b/data/masks/head_wm13_lips_DL_msk.tga differ diff --git a/data/masks/head_wm13_lips_DR_msk.tga b/data/masks/head_wm13_lips_DR_msk.tga new file mode 100644 index 00000000..c67f397d Binary files /dev/null and b/data/masks/head_wm13_lips_DR_msk.tga differ diff --git a/data/masks/head_wm13_lips_UL_msk.tga b/data/masks/head_wm13_lips_UL_msk.tga new file mode 100644 index 00000000..6ff4a733 Binary files /dev/null and b/data/masks/head_wm13_lips_UL_msk.tga differ diff --git a/data/masks/head_wm13_lips_UR_msk.tga b/data/masks/head_wm13_lips_UR_msk.tga new file mode 100644 index 00000000..852820f0 Binary files /dev/null and b/data/masks/head_wm13_lips_UR_msk.tga differ diff --git a/data/masks/head_wm1_blink_L_msk.tga b/data/masks/head_wm1_blink_L_msk.tga new file mode 100644 index 00000000..85170f33 Binary files /dev/null and b/data/masks/head_wm1_blink_L_msk.tga differ diff --git a/data/masks/head_wm1_blink_R_msk.tga b/data/masks/head_wm1_blink_R_msk.tga new file mode 100644 index 00000000..d157e88c Binary files /dev/null and b/data/masks/head_wm1_blink_R_msk.tga differ diff --git a/data/masks/head_wm1_browsRaiseInner_L_msk.tga b/data/masks/head_wm1_browsRaiseInner_L_msk.tga new file mode 100644 index 00000000..c9bf1f2c Binary files /dev/null and b/data/masks/head_wm1_browsRaiseInner_L_msk.tga differ diff --git a/data/masks/head_wm1_browsRaiseInner_R_msk.tga b/data/masks/head_wm1_browsRaiseInner_R_msk.tga new file mode 100644 index 00000000..90fe9e18 Binary files /dev/null and b/data/masks/head_wm1_browsRaiseInner_R_msk.tga differ diff --git a/data/masks/head_wm1_browsRaiseOuter_L_msk.tga b/data/masks/head_wm1_browsRaiseOuter_L_msk.tga new file mode 100644 index 00000000..360e5b9a Binary files /dev/null and b/data/masks/head_wm1_browsRaiseOuter_L_msk.tga differ diff --git a/data/masks/head_wm1_browsRaiseOuter_R_msk.tga b/data/masks/head_wm1_browsRaiseOuter_R_msk.tga new file mode 100644 index 00000000..ec1574e6 Binary files /dev/null and b/data/masks/head_wm1_browsRaiseOuter_R_msk.tga differ diff --git a/data/masks/head_wm1_chinRaise_L_msk.tga b/data/masks/head_wm1_chinRaise_L_msk.tga new file mode 100644 index 00000000..fba5930b Binary files /dev/null and b/data/masks/head_wm1_chinRaise_L_msk.tga differ diff --git a/data/masks/head_wm1_chinRaise_R_msk.tga b/data/masks/head_wm1_chinRaise_R_msk.tga new file mode 100644 index 00000000..36d2e0de Binary files /dev/null and b/data/masks/head_wm1_chinRaise_R_msk.tga differ diff --git a/data/masks/head_wm1_jawOpen_msk.tga b/data/masks/head_wm1_jawOpen_msk.tga new file mode 100644 index 00000000..c3e7407a Binary files /dev/null and b/data/masks/head_wm1_jawOpen_msk.tga differ diff --git a/data/masks/head_wm1_purse_DL_msk.tga b/data/masks/head_wm1_purse_DL_msk.tga new file mode 100644 index 00000000..982f0e9b Binary files /dev/null and b/data/masks/head_wm1_purse_DL_msk.tga differ diff --git a/data/masks/head_wm1_purse_DR_msk.tga b/data/masks/head_wm1_purse_DR_msk.tga new file mode 100644 index 00000000..584f688c Binary files /dev/null and b/data/masks/head_wm1_purse_DR_msk.tga differ diff --git a/data/masks/head_wm1_purse_UL_msk.tga b/data/masks/head_wm1_purse_UL_msk.tga new file mode 100644 index 00000000..7ccbde03 Binary files /dev/null and b/data/masks/head_wm1_purse_UL_msk.tga differ diff --git a/data/masks/head_wm1_purse_UR_msk.tga b/data/masks/head_wm1_purse_UR_msk.tga new file mode 100644 index 00000000..bc6834e7 Binary files /dev/null and b/data/masks/head_wm1_purse_UR_msk.tga differ diff --git a/data/masks/head_wm1_squintInner_L_msk.tga b/data/masks/head_wm1_squintInner_L_msk.tga new file mode 100644 index 00000000..cc09c13d Binary files /dev/null and b/data/masks/head_wm1_squintInner_L_msk.tga differ diff --git a/data/masks/head_wm1_squintInner_R_msk.tga b/data/masks/head_wm1_squintInner_R_msk.tga new file mode 100644 index 00000000..7517d613 Binary files /dev/null and b/data/masks/head_wm1_squintInner_R_msk.tga differ diff --git a/data/masks/head_wm2_browsDown_L_msk.tga b/data/masks/head_wm2_browsDown_L_msk.tga new file mode 100644 index 00000000..fb11855b Binary files /dev/null and b/data/masks/head_wm2_browsDown_L_msk.tga differ diff --git a/data/masks/head_wm2_browsDown_R_msk.tga b/data/masks/head_wm2_browsDown_R_msk.tga new file mode 100644 index 00000000..8b1e2ddb Binary files /dev/null and b/data/masks/head_wm2_browsDown_R_msk.tga differ diff --git a/data/masks/head_wm2_browsLateral_L_msk.tga b/data/masks/head_wm2_browsLateral_L_msk.tga new file mode 100644 index 00000000..ae58d2ec Binary files /dev/null and b/data/masks/head_wm2_browsLateral_L_msk.tga differ diff --git a/data/masks/head_wm2_browsLateral_R_msk.tga b/data/masks/head_wm2_browsLateral_R_msk.tga new file mode 100644 index 00000000..108e19fe Binary files /dev/null and b/data/masks/head_wm2_browsLateral_R_msk.tga differ diff --git a/data/masks/head_wm2_mouthStretch_L_msk.tga b/data/masks/head_wm2_mouthStretch_L_msk.tga new file mode 100644 index 00000000..2a5e7e44 Binary files /dev/null and b/data/masks/head_wm2_mouthStretch_L_msk.tga differ diff --git a/data/masks/head_wm2_mouthStretch_R_msk.tga b/data/masks/head_wm2_mouthStretch_R_msk.tga new file mode 100644 index 00000000..6c6e2fc4 Binary files /dev/null and b/data/masks/head_wm2_mouthStretch_R_msk.tga differ diff --git a/data/masks/head_wm2_neckStretch_L_msk.tga b/data/masks/head_wm2_neckStretch_L_msk.tga new file mode 100644 index 00000000..0f65e73f Binary files /dev/null and b/data/masks/head_wm2_neckStretch_L_msk.tga differ diff --git a/data/masks/head_wm2_neckStretch_R_msk.tga b/data/masks/head_wm2_neckStretch_R_msk.tga new file mode 100644 index 00000000..3fe8b45d Binary files /dev/null and b/data/masks/head_wm2_neckStretch_R_msk.tga differ diff --git a/data/masks/head_wm2_noseWrinkler_L_msk.tga b/data/masks/head_wm2_noseWrinkler_L_msk.tga new file mode 100644 index 00000000..837ae6a2 Binary files /dev/null and b/data/masks/head_wm2_noseWrinkler_L_msk.tga differ diff --git a/data/masks/head_wm2_noseWrinkler_R_msk.tga b/data/masks/head_wm2_noseWrinkler_R_msk.tga new file mode 100644 index 00000000..8263f14b Binary files /dev/null and b/data/masks/head_wm2_noseWrinkler_R_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseInner_L_msk.tga b/data/masks/head_wm3_cheekRaiseInner_L_msk.tga new file mode 100644 index 00000000..8b31fa54 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseInner_L_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseInner_R_msk.tga b/data/masks/head_wm3_cheekRaiseInner_R_msk.tga new file mode 100644 index 00000000..e3247c40 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseInner_R_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseOuter_L_msk.tga b/data/masks/head_wm3_cheekRaiseOuter_L_msk.tga new file mode 100644 index 00000000..32ea1249 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseOuter_L_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseOuter_R_msk.tga b/data/masks/head_wm3_cheekRaiseOuter_R_msk.tga new file mode 100644 index 00000000..8dbcbda7 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseOuter_R_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseUpper_L_msk.tga b/data/masks/head_wm3_cheekRaiseUpper_L_msk.tga new file mode 100644 index 00000000..1b706806 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseUpper_L_msk.tga differ diff --git a/data/masks/head_wm3_cheekRaiseUpper_R_msk.tga b/data/masks/head_wm3_cheekRaiseUpper_R_msk.tga new file mode 100644 index 00000000..fb614a22 Binary files /dev/null and b/data/masks/head_wm3_cheekRaiseUpper_R_msk.tga differ diff --git a/data/masks/head_wm3_smile_L_msk.tga b/data/masks/head_wm3_smile_L_msk.tga new file mode 100644 index 00000000..5ae0e66b Binary files /dev/null and b/data/masks/head_wm3_smile_L_msk.tga differ diff --git a/data/masks/head_wm3_smile_R_msk.tga b/data/masks/head_wm3_smile_R_msk.tga new file mode 100644 index 00000000..96709578 Binary files /dev/null and b/data/masks/head_wm3_smile_R_msk.tga differ diff --git a/data/shader.ma b/data/shader.ma new file mode 100644 index 00000000..5fca5e3f --- /dev/null +++ b/data/shader.ma @@ -0,0 +1,8545 @@ +//Maya ASCII 2018ff09 scene +//Name: head_shader.ma +//Last modified: Thu, May 11, 2023 11:07:07 AM +//Codeset: 1252 +requires maya "2018ff09"; +requires -nodeType "dx11Shader" "dx11Shader" "1.0"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2018"; +fileInfo "version" "2018"; +fileInfo "cutIdentifier" "201903222215-65bada0e52"; +fileInfo "osv" "Microsoft Windows 8 Enterprise Edition, 64-bit (Build 9200)\n"; +createNode transform -s -n "persp"; + rename -uid "CD1D855B-4CC1-03B9-E8CC-E6BF4F8A8291"; + setAttr ".v" no; + setAttr ".t" -type "double3" 24.558818622337995 37.536741765596531 49.473419305101473 ; + setAttr ".r" -type "double3" -34.200000000000081 26.400000000000034 0 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "F3CA1968-42E0-2562-D48E-8E92D22FAA9E"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".ncp" 5; + setAttr ".fcp" 5000; + setAttr ".coi" 66.781447814796309; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "454C4DAC-4672-A7BA-5681-D29524B95D6C"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 1000.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "10346C6E-4959-FD63-4770-EB86C0DA9A0F"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + rename -uid "438A88D8-4C74-4308-4781-ED938937582F"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 1000.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "91186241-41E7-C094-8F4D-EC8E7485B54C"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + rename -uid "DE4B3D3E-436D-1678-9588-73BCCD1336B9"; + setAttr ".v" no; + setAttr ".t" -type "double3" 1000.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "EC4CA487-46D7-CDDE-6A85-A1AB658FF36B"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "712B377D-4D04-ED6F-9279-4E87D1D1F47D"; + setAttr -s 11 ".lnk"; + setAttr -s 11 ".slnk"; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "72D2669D-45F9-DDB6-D9BF-9F83176C46B7"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "2407C35D-4457-2733-8A7D-5D904E5DE24C"; + setAttr -s 3 ".tpdt"; + setAttr ".tpdt[0].tpcd" -type "Int32Array" 1 -1 ; + setAttr ".tpdt[1].tpcd" -type "Int32Array" 1 -3 ; + setAttr ".tpdt[1].tpdn" -type "string" "skeleton_015"; + setAttr ".tpdt[3].tppi" 1; + setAttr ".tpdt[3].tpdn" -type "string" "bodyPoseRederSetup"; +createNode displayLayerManager -n "layerManager"; + rename -uid "79BFC8EF-470A-40F6-E1D2-E789AB9B3B69"; + setAttr -s 16 ".dli[1:15]" 1 2 3 4 5 6 7 8 + 9 10 11 12 13 14 15; +createNode displayLayer -n "defaultLayer"; + rename -uid "B6FB5592-4878-4F42-CE19-96A588BDA53F"; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "1B641219-4575-A2AC-6492-3CAA2ECDD1E4"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "4ECCDAA8-40DA-ADF4-1313-AC86E060F1AE"; + setAttr ".g" yes; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo"; + rename -uid "9FE00233-4A46-74DA-D6BA-018CBBE3D871"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -330.95236780151544 1.1904761431709079 ; + setAttr ".tgi[0].vh" -type "double2" 317.85713022663526 338.09522466054096 ; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "E113578C-46E2-6EF6-76C1-30A7C20853B8"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n" + + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n" + + " -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n" + + " -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n" + + " -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n" + + " -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -docTag \"RADRENDER\" \n -editorChanged \"updateModelPanelBar\" \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"all\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 1\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 0\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 1\n -captureSequenceNumber -1\n -width 1319\n -height 626\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n" + + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" + + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -selectCommand \"\" \n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n" + + " -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n" + + " -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 1\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n" + + " -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n" + + " -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -autoFitTime 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n" + + " -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n -outliner \"graphEditor1OutlineEd\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 1\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n" + + " -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"integer\" \n -snapValue \"none\" \n" + + " -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n" + + " -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n" + + " -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -autoFitTime 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n" + + " -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -image \"C:/work/Batman/characters/Bane/sourceimages/Bane_tpage_2048.tga\" \n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n" + + "\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n" + + " -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -editorMode \"default\" \n" + + " $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n" + + " -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -editorMode \"default\" \n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\n" + + "string $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -editorChanged \"updateModelPanelBar\" \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n" + + " -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererOverrideName \"stereoOverrideVP2\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n" + + " -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n" + + " -showTimeEditor 1\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n" + + " -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -selectCommand \"pass\" \n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -docTag \\\"RADRENDER\\\" \\n -editorChanged \\\"updateModelPanelBar\\\" \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"all\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 1\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 0\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 1\\n -captureSequenceNumber -1\\n -width 1319\\n -height 626\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -docTag \\\"RADRENDER\\\" \\n -editorChanged \\\"updateModelPanelBar\\\" \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"all\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 1\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 0\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 1\\n -captureSequenceNumber -1\\n -width 1319\\n -height 626\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "52A90A50-49D6-A85B-C0B8-41AF6075B53A"; + setAttr ".b" -type "string" "playbackOptions -min 0 -max 40 -ast 0 -aet 200 "; + setAttr ".st" 6; +createNode dx11Shader -n "shader_head_shader"; + rename -uid "DB32AAEB-43AB-449E-DBF5-E882184E97ED"; + addAttr -s false -is true -ci true -k true -sn "te" -ln "techniqueEnum" -nn "Technique" + -ct "HW_shader_parameter" -min 0 -max 2 -en "TessellationOFF" -at "enum"; + addAttr -ci true -sn "Light_0_use_implicit_lighting" -ln "Light_0_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_0_connected_light" -ln "Light_0_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_1_use_implicit_lighting" -ln "Light_1_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_1_connected_light" -ln "Light_1_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_2_use_implicit_lighting" -ln "Light_2_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_2_connected_light" -ln "Light_2_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Name" -ln "SuperFilterTaps_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Type" -ln "SuperFilterTaps_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps" -ln "SuperFilterTaps" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "SuperFilterTapsX" -ln "SuperFilterTapsX" -ct "HW_shader_parameter" + -dv -0.84052002429962158 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -sn "SuperFilterTapsY" -ln "SuperFilterTapsY" -ct "HW_shader_parameter" + -dv -0.073954001069068909 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Name" -ln "shadowMapTexelSize_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Type" -ln "shadowMapTexelSize_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize" -ln "shadowMapTexelSize" + -ct "HW_shader_parameter" -dv 0.0019531298894435167 -smn 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Name" -ln "LinearSpaceLighting_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Type" -ln "LinearSpaceLighting_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "LinearSpaceLighting" -ln "LinearSpaceLighting" + -nn "Linear Space Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseShadows_Name" -ln "UseShadows_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "UseShadows_Type" -ln "UseShadows_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "UseShadows" -ln "UseShadows" -nn "Shadows" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Name" -ln "shadowMultiplier_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Type" -ln "shadowMultiplier_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowMultiplier" -ln "shadowMultiplier" + -nn "Shadow Strength" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Name" -ln "IsSwatchRender_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Type" -ln "IsSwatchRender_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender" -ln "IsSwatchRender" -ct "HW_shader_parameter" + -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Name" -ln "shadowDepthBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Type" -ln "shadowDepthBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDepthBias" -ln "shadowDepthBias" -nn "Shadow Bias" + -ct "HW_shader_parameter" -dv 0.0099999997764825821 -min 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Name" -ln "MayaFullScreenGamma_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Type" -ln "MayaFullScreenGamma_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma" -ln "MayaFullScreenGamma" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Name" -ln "flipBackfaceNormals_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Type" -ln "flipBackfaceNormals_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "flipBackfaceNormals" -ln "flipBackfaceNormals" + -nn "Double Sided Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Enable_Name" -ln "light0Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Enable_Type" -ln "light0Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Enable" -ln "light0Enable" -nn "Enable Light 0" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Type_Name" -ln "light0Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Type_Type" -ln "light0Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Type" -ln "light0Type" -nn "Light 0 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light0Pos_Name" -ln "light0Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Pos_Type" -ln "light0Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Pos" -ln "light0Pos" -nn "Light 0 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0Color_Name" -ln "light0Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Color_Type" -ln "light0Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light0Color" -ln "light0Color" -nn "Light 0 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ColorR" -ln "light0ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorG" -ln "light0ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorB" -ln "light0ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -h true -sn "light0Intensity_Name" -ln "light0Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Intensity_Type" -ln "light0Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Intensity" -ln "light0Intensity" -nn "Light 0 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0Dir_Name" -ln "light0Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Dir_Type" -ln "light0Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Dir" -ln "light0Dir" -nn "Light 0 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Name" -ln "light0ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Type" -ln "light0ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0ConeAngle" -ln "light0ConeAngle" -nn "Light 0 Cone Angle" + -ct "HW_shader_parameter" -dv 0.46000000834465027 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0FallOff_Name" -ln "light0FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0FallOff_Type" -ln "light0FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0FallOff" -ln "light0FallOff" -nn "Light 0 Penumbra Angle" + -ct "HW_shader_parameter" -dv 0.69999998807907104 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Name" -ln "light0AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Type" -ln "light0AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0AttenScale" -ln "light0AttenScale" + -nn "Light 0 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Name" -ln "light0ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Type" -ln "light0ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn" -ln "light0ShadowOn" -nn "Light 0 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Enable_Name" -ln "light1Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Enable_Type" -ln "light1Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Enable" -ln "light1Enable" -nn "Enable Light 1" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Type_Name" -ln "light1Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Type_Type" -ln "light1Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Type" -ln "light1Type" -nn "Light 1 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light1Pos_Name" -ln "light1Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Pos_Type" -ln "light1Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Pos" -ln "light1Pos" -nn "Light 1 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1Color_Name" -ln "light1Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Color_Type" -ln "light1Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light1Color" -ln "light1Color" -nn "Light 1 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ColorR" -ln "light1ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorG" -ln "light1ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorB" -ln "light1ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -h true -sn "light1Intensity_Name" -ln "light1Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Intensity_Type" -ln "light1Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Intensity" -ln "light1Intensity" -nn "Light 1 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1Dir_Name" -ln "light1Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Dir_Type" -ln "light1Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Dir" -ln "light1Dir" -nn "Light 1 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Name" -ln "light1ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Type" -ln "light1ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1ConeAngle" -ln "light1ConeAngle" -nn "Light 1 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1FallOff_Name" -ln "light1FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1FallOff_Type" -ln "light1FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1FallOff" -ln "light1FallOff" -nn "Light 1 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Name" -ln "light1AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Type" -ln "light1AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1AttenScale" -ln "light1AttenScale" + -nn "Light 1 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Name" -ln "light1ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Type" -ln "light1ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn" -ln "light1ShadowOn" -nn "Light 1 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Enable_Name" -ln "light2Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Enable_Type" -ln "light2Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Enable" -ln "light2Enable" -nn "Enable Light 2" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Type_Name" -ln "light2Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Type_Type" -ln "light2Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Type" -ln "light2Type" -nn "Light 2 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light2Pos_Name" -ln "light2Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Pos_Type" -ln "light2Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Pos" -ln "light2Pos" -nn "Light 2 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2Color_Name" -ln "light2Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Color_Type" -ln "light2Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light2Color" -ln "light2Color" -nn "Light 2 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ColorR" -ln "light2ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorG" -ln "light2ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorB" -ln "light2ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -h true -sn "light2Intensity_Name" -ln "light2Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Intensity_Type" -ln "light2Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Intensity" -ln "light2Intensity" -nn "Light 2 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2Dir_Name" -ln "light2Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Dir_Type" -ln "light2Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Dir" -ln "light2Dir" -nn "Light 2 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Name" -ln "light2ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Type" -ln "light2ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2ConeAngle" -ln "light2ConeAngle" -nn "Light 2 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2FallOff_Name" -ln "light2FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2FallOff_Type" -ln "light2FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2FallOff" -ln "light2FallOff" -nn "Light 2 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Name" -ln "light2AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Type" -ln "light2AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2AttenScale" -ln "light2AttenScale" + -nn "Light 2 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Name" -ln "light2ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Type" -ln "light2ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn" -ln "light2ShadowOn" -nn "Light 2 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Name" -ln "UseAmbientOcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Type" -ln "UseAmbientOcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseAmbientOcclusionTexture" -ln "UseAmbientOcclusionTexture" + -nn "Use Occlusion Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Name" -ln "transpDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Type" -ln "transpDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "transpDepthTexture" -ln "transpDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "transpDepthTextureR" -ln "transpDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureG" -ln "transpDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureB" -ln "transpDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Name" -ln "opaqueDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Type" -ln "opaqueDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "opaqueDepthTexture" -ln "opaqueDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "opaqueDepthTextureR" -ln "opaqueDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureG" -ln "opaqueDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureB" -ln "opaqueDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Name" -ln "UseDiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Type" -ln "UseDiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTexture" -ln "UseDiffuseTexture" + -nn "Use Diffuse Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Name" -ln "UseDiffuseTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Type" -ln "UseDiffuseTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTextureAlpha" -ln "UseDiffuseTextureAlpha" + -nn "Use Diffuse Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Name" -ln "DiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Type" -ln "DiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseTexture" -ln "DiffuseTexture" -nn "Diffuse Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseTextureR" -ln "DiffuseTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureG" -ln "DiffuseTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureB" -ln "DiffuseTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Name" -ln "DiffuseColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Type" -ln "DiffuseColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "DiffuseColor" -ln "DiffuseColor" -nn "Diffuse Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseColorR" -ln "DiffuseColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorG" -ln "DiffuseColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorB" -ln "DiffuseColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -h true -sn "Opacity_Name" -ln "Opacity_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Opacity_Type" -ln "Opacity_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Opacity" -ln "Opacity" -nn "Opacity" -ct "HW_shader_parameter" + -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Name" -ln "UseOpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Type" -ln "UseOpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseOpacityMaskTexture" -ln "UseOpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Name" -ln "OpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Type" -ln "OpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OpacityMaskTexture" -ln "OpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OpacityMaskTextureR" -ln "OpacityMaskTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureG" -ln "OpacityMaskTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureB" -ln "OpacityMaskTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Name" -ln "OpacityMaskBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Type" -ln "OpacityMaskBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskBias" -ln "OpacityMaskBias" -nn "Opacity Mask Bias" + -ct "HW_shader_parameter" -dv 0.10000000149011612 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Name" -ln "UseSpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Type" -ln "UseSpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTexture" -ln "UseSpecularTexture" + -nn "Use Specular Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Name" -ln "SpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Type" -ln "SpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularTexture" -ln "SpecularTexture" -nn "Specular Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularTextureR" -ln "SpecularTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureG" -ln "SpecularTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureB" -ln "SpecularTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -h true -sn "SpecularColor_Name" -ln "SpecularColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularColor_Type" -ln "SpecularColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "SpecularColor" -ln "SpecularColor" -nn "Specular Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularColorR" -ln "SpecularColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorG" -ln "SpecularColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorB" -ln "SpecularColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Name" -ln "UseNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Type" -ln "UseNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseNormalTexture" -ln "UseNormalTexture" + -nn "Use Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalTexture_Name" -ln "NormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexture_Type" -ln "NormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "NormalTexture" -ln "NormalTexture" -nn "Normal Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "NormalTextureR" -ln "NormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureG" -ln "NormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureB" -ln "NormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -h true -sn "NormalHeight_Name" -ln "NormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalHeight_Type" -ln "NormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalHeight" -ln "NormalHeight" -nn "Normal Height" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx 5 -at "float"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Name" -ln "SupportNonUniformScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Type" -ln "SupportNonUniformScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SupportNonUniformScale" -ln "SupportNonUniformScale" + -nn "Support Non-Uniform Scale" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Name" -ln "NormalCoordsysX_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Type" -ln "NormalCoordsysX_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysX" -ln "NormalCoordsysX" -nn "Normal X (Red)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Name" -ln "NormalCoordsysY_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Type" -ln "NormalCoordsysY_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysY" -ln "NormalCoordsysY" -nn "Normal Y (Green)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Name" -ln "DisplacementModel_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Type" -ln "DisplacementModel_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementModel" -ln "DisplacementModel" + -nn "Displacement Model" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en + "Grayscale:Tangent Vector" -at "enum"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Name" -ln "UseDisplacementMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Type" -ln "UseDisplacementMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDisplacementMap" -ln "UseDisplacementMap" + -nn "Displacement Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Name" -ln "DisplacementTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Type" -ln "DisplacementTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DisplacementTexture" -ln "DisplacementTexture" + -nn "Displacement Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DisplacementTextureR" -ln "DisplacementTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureG" -ln "DisplacementTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureB" -ln "DisplacementTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Name" -ln "VectorDisplacementCoordSys_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Type" -ln "VectorDisplacementCoordSys_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "VectorDisplacementCoordSys" -ln "VectorDisplacementCoordSys" + -nn "Displacement Coordsys" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 + -en "Mudbox (XZY):Maya (XYZ)" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Name" -ln "DisplacementHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Type" -ln "DisplacementHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementHeight" -ln "DisplacementHeight" + -nn "Displacement Height" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Name" -ln "DisplacementOffset_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Type" -ln "DisplacementOffset_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementOffset" -ln "DisplacementOffset" + -nn "Displacement Offset" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn -1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Name" -ln "DisplacementClippingBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Type" -ln "DisplacementClippingBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementClippingBias" -ln "DisplacementClippingBias" + -nn "Displacement Clipping Bias" -ct "HW_shader_parameter" -dv 5 -min -99999 -max + 99999 -smn 0 -smx 99 -at "float"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Name" -ln "BBoxExtraScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Type" -ln "BBoxExtraScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "BBoxExtraScale" -ln "BBoxExtraScale" -nn "Bounding Box Extra Scale" + -ct "HW_shader_parameter" -dv 1 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationRange_Name" -ln "TessellationRange_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationRange_Type" -ln "TessellationRange_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationRange" -ln "TessellationRange" + -nn "Tessellation Range" -ct "HW_shader_parameter" -min 0 -max 99999 -smx 999 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationMin_Name" -ln "TessellationMin_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationMin_Type" -ln "TessellationMin_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationMin" -ln "TessellationMin" -nn "Tessellation Minimum" + -ct "HW_shader_parameter" -dv 3 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Name" -ln "FlatTessellation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Type" -ln "FlatTessellation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "FlatTessellation" -ln "FlatTessellation" + -nn "Flat Tessellation" -ct "HW_shader_parameter" -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Name" -ln "UseTranslucency_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Type" -ln "UseTranslucency_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseTranslucency" -ln "UseTranslucency" -nn "Back Scattering" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Name" -ln "UseThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Type" -ln "UseThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseThicknessTexture" -ln "UseThicknessTexture" + -nn "Use Thickness Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Name" -ln "UseDiffuseIBLMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Type" -ln "UseDiffuseIBLMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseIBLMap" -ln "UseDiffuseIBLMap" + -nn "Use Diffuse Cubemap" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Name" -ln "DiffuseIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Type" -ln "DiffuseIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseIBLIntensity" -ln "DiffuseIBLIntensity" + -nn "Diffuse IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Name" -ln "DiffuseTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Type" -ln "DiffuseTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseTexcoord" -ln "DiffuseTexcoord" -nn "Diffuse Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Name" -ln "OpacityMaskTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Type" -ln "OpacityMaskTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskTexcoord" -ln "OpacityMaskTexcoord" + -nn "Opacity Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Name" -ln "SpecularTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Type" -ln "SpecularTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularTexcoord" -ln "SpecularTexcoord" + -nn "Specular Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Name" -ln "NormalTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Type" -ln "NormalTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalTexcoord" -ln "NormalTexcoord" -nn "Normal Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Name" -ln "DisplacementTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Type" -ln "DisplacementTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementTexcoord" -ln "DisplacementTexcoord" + -nn "Displacement Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en + "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Name" -ln "ThicknessTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Type" -ln "ThicknessTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "ThicknessTexcoord" -ln "ThicknessTexcoord" + -nn "Translucency Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 + -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Name" -ln "light0ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Type" -ln "light0ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light0ShadowMap" -ln "light0ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ShadowMapR" -ln "light0ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapG" -ln "light0ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapB" -ln "light0ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Name" -ln "light1ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Type" -ln "light1ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light1ShadowMap" -ln "light1ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ShadowMapR" -ln "light1ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapG" -ln "light1ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapB" -ln "light1ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Name" -ln "light2ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Type" -ln "light2ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light2ShadowMap" -ln "light2ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ShadowMapR" -ln "light2ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapG" -ln "light2ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapB" -ln "light2ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -h true -sn "screenSize_Name" -ln "screenSize_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize_Type" -ln "screenSize_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize" -ln "screenSize" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "screenSizeX" -ln "screenSizeX" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -sn "screenSizeY" -ln "screenSizeY" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -h true -sn "SkyRotation_Name" -ln "SkyRotation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SkyRotation_Type" -ln "SkyRotation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SkyRotation" -ln "SkyRotation" -nn "Sky Rotation" + -ct "HW_shader_parameter" -min 0 -max 99999 -smn 0 -smx 360 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Name" -ln "DiffuseCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Type" -ln "DiffuseCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseCubeIBL" -ln "DiffuseCubeIBL" -nn "Diffuse Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseCubeIBLR" -ln "DiffuseCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLG" -ln "DiffuseCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLB" -ln "DiffuseCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Name" -ln "UseSpecCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Type" -ln "UseSpecCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecCubeIBL" -ln "UseSpecCubeIBL" -nn "Use Specular Cubemap" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Name" -ln "SpecularIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Type" -ln "SpecularIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularIBLIntensity" -ln "SpecularIBLIntensity" + -nn "Specular IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Name" -ln "SpecularCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Type" -ln "SpecularCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularCubeIBL" -ln "SpecularCubeIBL" -nn "Specular Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularCubeIBLR" -ln "SpecularCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLG" -ln "SpecularCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLB" -ln "SpecularCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -h true -sn "LutTexture_Name" -ln "LutTexture_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LutTexture_Type" -ln "LutTexture_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -uac -sn "LutTexture" -ln "LutTexture" -nn "SSS LUT Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "LutTextureR" -ln "LutTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureG" -ln "LutTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureB" -ln "LutTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -h true -sn "DitherTexture_Name" -ln "DitherTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DitherTexture_Type" -ln "DitherTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DitherTexture" -ln "DitherTexture" -nn "SSS Dither Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DitherTextureR" -ln "DitherTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureG" -ln "DitherTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureB" -ln "DitherTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Name" -ln "skinCoeffX_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Type" -ln "skinCoeffX_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffX" -ln "skinCoeffX" -nn "SSS Coeffient R" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Name" -ln "skinCoeffY_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Type" -ln "skinCoeffY_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffY" -ln "skinCoeffY" -nn "SSS Coeffient G" + -ct "HW_shader_parameter" -dv 0.5 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Name" -ln "skinCoeffZ_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Type" -ln "skinCoeffZ_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffZ" -ln "skinCoeffZ" -nn "SSS Coeffient B" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Name" -ln "NormalBlurring_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Type" -ln "NormalBlurring_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalBlurring" -ln "NormalBlurring" -nn "SSS Softness" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Name" -ln "UseScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Type" -ln "UseScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseScatteringRadiusTexture" -ln "UseScatteringRadiusTexture" + -nn "Use SSS Radius Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Name" -ln "ScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Type" -ln "ScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "ScatteringRadiusTexture" -ln "ScatteringRadiusTexture" + -nn "SSS Radius Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "ScatteringRadiusTextureR" -ln "ScatteringRadiusTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureG" -ln "ScatteringRadiusTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureB" -ln "ScatteringRadiusTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -h true -sn "skinScattering_Name" -ln "skinScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScattering_Type" -ln "skinScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScattering" -ln "skinScattering" -nn "SSS Radius" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowDither_Name" -ln "shadowDither_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDither_Type" -ln "shadowDither_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDither" -ln "shadowDither" -nn "SSS Shadow Dither" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowBlur_Name" -ln "shadowBlur_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "shadowBlur_Type" -ln "shadowBlur_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "shadowBlur" -ln "shadowBlur" -nn "SSS Shadow Blur" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowScattering_Name" -ln "shadowScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowScattering_Type" -ln "shadowScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowScattering" -ln "shadowScattering" + -nn "SSS Shadow Scattering" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Name" -ln "shadowSaturation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Type" -ln "shadowSaturation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowSaturation" -ln "shadowSaturation" + -nn "SSS Shadow Saturation" -ct "HW_shader_parameter" -dv 1 -min 0 -max 4 -smx 4 + -at "float"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Name" -ln "BackScatteringThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Type" -ln "BackScatteringThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "BackScatteringThicknessTexture" -ln "BackScatteringThicknessTexture" + -nn "Thickness Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureR" -ln "BackScatteringThicknessTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureG" -ln "BackScatteringThicknessTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureB" -ln "BackScatteringThicknessTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Name" -ln "skinScatteringRoughness_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Type" -ln "skinScatteringRoughness_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringRoughness" -ln "skinScatteringRoughness" + -nn "Back Scattering Width" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Name" -ln "skinScatteringOuterColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Type" -ln "skinScatteringOuterColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "skinScatteringOuterColor" -ln "skinScatteringOuterColor" + -nn "Back Scattering Color" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "skinScatteringOuterColorR" -ln "skinScatteringOuterColorR" + -ct "HW_shader_parameter" -dv 0.25 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorG" -ln "skinScatteringOuterColorG" + -ct "HW_shader_parameter" -dv 0.05000000074505806 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorB" -ln "skinScatteringOuterColorB" + -ct "HW_shader_parameter" -dv 0.019999999552965164 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Name" -ln "skinScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Type" -ln "skinScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringAmount" -ln "skinScatteringAmount" + -nn "Back Scattering Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 6 -smx 6 + -at "float"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Name" -ln "skinAmbientScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Type" -ln "skinAmbientScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinAmbientScatteringAmount" -ln "skinAmbientScatteringAmount" + -nn "Back Scattering Ambient Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max + 6 -smx 6 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Name" -ln "UseSpecularTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Type" -ln "UseSpecularTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTextureAlpha" -ln "UseSpecularTextureAlpha" + -nn "Use Roughness Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "LobeMix_Name" -ln "LobeMix_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LobeMix_Type" -ln "LobeMix_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "LobeMix" -ln "LobeMix" -nn "Lobe Mixing" + -ct "HW_shader_parameter" -dv 0.75 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "Roughness_Name" -ln "Roughness_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Roughness_Type" -ln "Roughness_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Roughness" -ln "Roughness" -nn "Roughness multiplier" + -ct "HW_shader_parameter" -dv 0.20000000298023224 -min 0.0099999997764825821 -max + 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Name" -ln "OcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Type" -ln "OcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OcclusionTexture" -ln "OcclusionTexture" -nn "Ambient Occlusion Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OcclusionTextureR" -ln "OcclusionTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureG" -ln "OcclusionTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureB" -ln "OcclusionTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Name" -ln "OcclusionAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Type" -ln "OcclusionAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionAmount" -ln "OcclusionAmount" -nn "Occlusion Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Name" -ln "UseCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Type" -ln "UseCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseCavityTexture" -ln "UseCavityTexture" + -nn "Use Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "CavityTexture_Name" -ln "CavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityTexture_Type" -ln "CavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "CavityTexture" -ln "CavityTexture" -nn "Cavity Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "CavityTextureR" -ln "CavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureG" -ln "CavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureB" -ln "CavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -h true -sn "CavityAmount_Name" -ln "CavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityAmount_Type" -ln "CavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "CavityAmount" -ln "CavityAmount" -nn "Cavity Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Name" -ln "UseMicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Type" -ln "UseMicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroCavityTexture" -ln "UseMicroCavityTexture" + -nn "Use Micro Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Name" -ln "MicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Type" -ln "MicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroCavityTexture" -ln "MicroCavityTexture" + -nn "Micro Cavity Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroCavityTextureR" -ln "MicroCavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureG" -ln "MicroCavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureB" -ln "MicroCavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Name" -ln "MicroCavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Type" -ln "MicroCavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroCavityAmount" -ln "MicroCavityAmount" + -nn "Micro Cavity Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Name" -ln "UseMicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Type" -ln "UseMicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroNormalTexture" -ln "UseMicroNormalTexture" + -nn "Use Micro Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Name" -ln "MicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Type" -ln "MicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroNormalTexture" -ln "MicroNormalTexture" + -nn "Micro Normal Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroNormalTextureR" -ln "MicroNormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureG" -ln "MicroNormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureB" -ln "MicroNormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Name" -ln "MicroNormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Type" -ln "MicroNormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroNormalHeight" -ln "MicroNormalHeight" + -nn "Micro Normal Height" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 5 -at "float"; + addAttr -is true -ci true -h true -sn "MicroScale_Name" -ln "MicroScale_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "MicroScale_Type" -ln "MicroScale_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "MicroScale" -ln "MicroScale" -nn "Micro Scale" + -ct "HW_shader_parameter" -dv 32 -min 16 -max 99999 -smx 256 -at "float"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Name" -ln "UseBlendTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Type" -ln "UseBlendTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseBlendTexture" -ln "UseBlendTexture" -nn "Enable Wrinkle Mixing" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Name" -ln "OcclusionTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Type" -ln "OcclusionTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionTexcoord" -ln "OcclusionTexcoord" + -nn "Ambient Occlusion Map UV" -ct "HW_shader_parameter" -dv 1 -min 0 -max 2 -smn + 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -ci true -sn "Position" -ln "Position" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Position_Name" -ln "Position_Name" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -h true -sn "Position_Source" -ln "Position_Source" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -sn "Position_DefaultTexture" -ln "Position_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Position"; + addAttr -ci true -sn "TexCoord0" -ln "TexCoord0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord0_Name" -ln "TexCoord0_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -h true -sn "TexCoord0_Source" -ln "TexCoord0_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -sn "TexCoord0_DefaultTexture" -ln "TexCoord0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -ci true -sn "TexCoord1" -ln "TexCoord1" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord1_Name" -ln "TexCoord1_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -h true -sn "TexCoord1_Source" -ln "TexCoord1_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -sn "TexCoord1_DefaultTexture" -ln "TexCoord1_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -ci true -sn "TexCoord2" -ln "TexCoord2" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord2_Name" -ln "TexCoord2_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -h true -sn "TexCoord2_Source" -ln "TexCoord2_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -sn "TexCoord2_DefaultTexture" -ln "TexCoord2_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -ci true -sn "Normal" -ln "Normal" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Normal_Name" -ln "Normal_Name" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -h true -sn "Normal_Source" -ln "Normal_Source" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -sn "Normal_DefaultTexture" -ln "Normal_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Normal"; + addAttr -ci true -sn "Binormal0" -ln "Binormal0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Binormal0_Name" -ln "Binormal0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Binormal0"; + addAttr -is true -ci true -h true -sn "Binormal0_Source" -ln "Binormal0_Source" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -is true -ci true -sn "Binormal0_DefaultTexture" -ln "Binormal0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -ci true -sn "Tangent0" -ln "Tangent0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Tangent0_Name" -ln "Tangent0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -h true -sn "Tangent0_Source" -ln "Tangent0_Source" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -sn "Tangent0_DefaultTexture" -ln "Tangent0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Tangent0"; + addAttr -is true -ci true -h true -sn "animNormalMap_00_Name" -ln "animNormalMap_00_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animNormalMap_00_Type" -ln "animNormalMap_00_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animNormalMap_00" -ln "animNormalMap_00" -nn "Wrinkle Map 00" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animNormalMap_00R" -ln "animNormalMap_00R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_00"; + addAttr -is true -ci true -sn "animNormalMap_00G" -ln "animNormalMap_00G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_00"; + addAttr -is true -ci true -sn "animNormalMap_00B" -ln "animNormalMap_00B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_00"; + addAttr -is true -ci true -h true -sn "maskChannel_00_Name" -ln "maskChannel_00_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_00_Type" -ln "maskChannel_00_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_00" -ln "maskChannel_00" -nn "Channel 00 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_00R" -ln "maskChannel_00R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_00"; + addAttr -is true -ci true -sn "maskChannel_00G" -ln "maskChannel_00G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_00"; + addAttr -is true -ci true -sn "maskChannel_00B" -ln "maskChannel_00B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_00"; + addAttr -is true -ci true -h true -sn "maskChannel_01_Name" -ln "maskChannel_01_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_01_Type" -ln "maskChannel_01_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_01" -ln "maskChannel_01" -nn "Channel 01 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_01R" -ln "maskChannel_01R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_01"; + addAttr -is true -ci true -sn "maskChannel_01G" -ln "maskChannel_01G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_01"; + addAttr -is true -ci true -sn "maskChannel_01B" -ln "maskChannel_01B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_01"; + addAttr -is true -ci true -h true -sn "animNormalMap_01_Name" -ln "animNormalMap_01_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animNormalMap_01_Type" -ln "animNormalMap_01_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animNormalMap_01" -ln "animNormalMap_01" -nn "Wrinkle Map 01" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animNormalMap_01R" -ln "animNormalMap_01R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_01"; + addAttr -is true -ci true -sn "animNormalMap_01G" -ln "animNormalMap_01G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_01"; + addAttr -is true -ci true -sn "animNormalMap_01B" -ln "animNormalMap_01B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_01"; + addAttr -is true -ci true -h true -sn "maskChannel_02_Name" -ln "maskChannel_02_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_02_Type" -ln "maskChannel_02_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_02" -ln "maskChannel_02" -nn "Channel 02 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_02R" -ln "maskChannel_02R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_02"; + addAttr -is true -ci true -sn "maskChannel_02G" -ln "maskChannel_02G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_02"; + addAttr -is true -ci true -sn "maskChannel_02B" -ln "maskChannel_02B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_02"; + addAttr -is true -ci true -h true -sn "animNormalMap_02_Name" -ln "animNormalMap_02_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animNormalMap_02_Type" -ln "animNormalMap_02_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animNormalMap_02" -ln "animNormalMap_02" -nn "Wrinkle Map 02" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animNormalMap_02R" -ln "animNormalMap_02R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_02"; + addAttr -is true -ci true -sn "animNormalMap_02G" -ln "animNormalMap_02G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_02"; + addAttr -is true -ci true -sn "animNormalMap_02B" -ln "animNormalMap_02B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animNormalMap_02"; + addAttr -is true -ci true -h true -sn "maskChannel_03_Name" -ln "maskChannel_03_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_03_Type" -ln "maskChannel_03_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_03" -ln "maskChannel_03" -nn "Channel 03 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_03R" -ln "maskChannel_03R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_03"; + addAttr -is true -ci true -sn "maskChannel_03G" -ln "maskChannel_03G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_03"; + addAttr -is true -ci true -sn "maskChannel_03B" -ln "maskChannel_03B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_03"; + addAttr -is true -ci true -h true -sn "animColorMap_00_Name" -ln "animColorMap_00_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animColorMap_00_Type" -ln "animColorMap_00_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animColorMap_00" -ln "animColorMap_00" -nn "Blood Flow 00" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animColorMap_00R" -ln "animColorMap_00R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_00"; + addAttr -is true -ci true -sn "animColorMap_00G" -ln "animColorMap_00G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_00"; + addAttr -is true -ci true -sn "animColorMap_00B" -ln "animColorMap_00B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_00"; + addAttr -is true -ci true -h true -sn "maskChannel_04_Name" -ln "maskChannel_04_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_04_Type" -ln "maskChannel_04_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_04" -ln "maskChannel_04" -nn "Channel 04 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_04R" -ln "maskChannel_04R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_04"; + addAttr -is true -ci true -sn "maskChannel_04G" -ln "maskChannel_04G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_04"; + addAttr -is true -ci true -sn "maskChannel_04B" -ln "maskChannel_04B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_04"; + addAttr -is true -ci true -h true -sn "animColorMap_01_Name" -ln "animColorMap_01_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animColorMap_01_Type" -ln "animColorMap_01_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animColorMap_01" -ln "animColorMap_01" -nn "Blood Flow 01" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animColorMap_01R" -ln "animColorMap_01R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_01"; + addAttr -is true -ci true -sn "animColorMap_01G" -ln "animColorMap_01G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_01"; + addAttr -is true -ci true -sn "animColorMap_01B" -ln "animColorMap_01B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_01"; + addAttr -is true -ci true -h true -sn "animColorMap_02_Name" -ln "animColorMap_02_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "animColorMap_02_Type" -ln "animColorMap_02_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "animColorMap_02" -ln "animColorMap_02" -nn "Blood Flow 02" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "animColorMap_02R" -ln "animColorMap_02R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_02"; + addAttr -is true -ci true -sn "animColorMap_02G" -ln "animColorMap_02G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_02"; + addAttr -is true -ci true -sn "animColorMap_02B" -ln "animColorMap_02B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "animColorMap_02"; + addAttr -is true -ci true -h true -sn "maskChannel_05_Name" -ln "maskChannel_05_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_05_Type" -ln "maskChannel_05_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_05" -ln "maskChannel_05" -nn "Channel 05 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_05R" -ln "maskChannel_05R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_05"; + addAttr -is true -ci true -sn "maskChannel_05G" -ln "maskChannel_05G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_05"; + addAttr -is true -ci true -sn "maskChannel_05B" -ln "maskChannel_05B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_05"; + addAttr -is true -ci true -h true -sn "maskWeight_00_Name" -ln "maskWeight_00_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_00_Type" -ln "maskWeight_00_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_00" -ln "maskWeight_00" -nn "Channel 00 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_06_Name" -ln "maskChannel_06_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_06_Type" -ln "maskChannel_06_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_06" -ln "maskChannel_06" -nn "Channel 06 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_06R" -ln "maskChannel_06R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_06"; + addAttr -is true -ci true -sn "maskChannel_06G" -ln "maskChannel_06G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_06"; + addAttr -is true -ci true -sn "maskChannel_06B" -ln "maskChannel_06B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_06"; + addAttr -is true -ci true -h true -sn "maskWeight_01_Name" -ln "maskWeight_01_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_01_Type" -ln "maskWeight_01_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_01" -ln "maskWeight_01" -nn "Channel 01 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_07_Name" -ln "maskChannel_07_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_07_Type" -ln "maskChannel_07_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_07" -ln "maskChannel_07" -nn "Channel 07 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_07R" -ln "maskChannel_07R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_07"; + addAttr -is true -ci true -sn "maskChannel_07G" -ln "maskChannel_07G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_07"; + addAttr -is true -ci true -sn "maskChannel_07B" -ln "maskChannel_07B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_07"; + addAttr -is true -ci true -h true -sn "maskWeight_02_Name" -ln "maskWeight_02_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_02_Type" -ln "maskWeight_02_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_02" -ln "maskWeight_02" -nn "Channel 02 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_08_Name" -ln "maskChannel_08_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_08_Type" -ln "maskChannel_08_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_08" -ln "maskChannel_08" -nn "Channel 08 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_08R" -ln "maskChannel_08R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_08"; + addAttr -is true -ci true -sn "maskChannel_08G" -ln "maskChannel_08G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_08"; + addAttr -is true -ci true -sn "maskChannel_08B" -ln "maskChannel_08B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_08"; + addAttr -is true -ci true -h true -sn "maskChannel_09_Name" -ln "maskChannel_09_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_09_Type" -ln "maskChannel_09_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_09" -ln "maskChannel_09" -nn "Channel 09 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_09R" -ln "maskChannel_09R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_09"; + addAttr -is true -ci true -sn "maskChannel_09G" -ln "maskChannel_09G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_09"; + addAttr -is true -ci true -sn "maskChannel_09B" -ln "maskChannel_09B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_09"; + addAttr -is true -ci true -h true -sn "maskWeight_03_Name" -ln "maskWeight_03_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_03_Type" -ln "maskWeight_03_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_03" -ln "maskWeight_03" -nn "Channel 03 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_10_Name" -ln "maskChannel_10_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_10_Type" -ln "maskChannel_10_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_10" -ln "maskChannel_10" -nn "Channel 10 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_10R" -ln "maskChannel_10R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_10"; + addAttr -is true -ci true -sn "maskChannel_10G" -ln "maskChannel_10G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_10"; + addAttr -is true -ci true -sn "maskChannel_10B" -ln "maskChannel_10B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_10"; + addAttr -is true -ci true -h true -sn "maskWeight_04_Name" -ln "maskWeight_04_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_04_Type" -ln "maskWeight_04_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_04" -ln "maskWeight_04" -nn "Channel 04 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_05_Name" -ln "maskWeight_05_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_05_Type" -ln "maskWeight_05_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_05" -ln "maskWeight_05" -nn "Channel 05 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_11_Name" -ln "maskChannel_11_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_11_Type" -ln "maskChannel_11_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_11" -ln "maskChannel_11" -nn "Channel 11 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_11R" -ln "maskChannel_11R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_11"; + addAttr -is true -ci true -sn "maskChannel_11G" -ln "maskChannel_11G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_11"; + addAttr -is true -ci true -sn "maskChannel_11B" -ln "maskChannel_11B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_11"; + addAttr -is true -ci true -h true -sn "maskWeight_06_Name" -ln "maskWeight_06_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_06_Type" -ln "maskWeight_06_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_06" -ln "maskWeight_06" -nn "Channel 06 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_12_Name" -ln "maskChannel_12_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_12_Type" -ln "maskChannel_12_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_12" -ln "maskChannel_12" -nn "Channel 12 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_12R" -ln "maskChannel_12R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_12"; + addAttr -is true -ci true -sn "maskChannel_12G" -ln "maskChannel_12G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_12"; + addAttr -is true -ci true -sn "maskChannel_12B" -ln "maskChannel_12B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_12"; + addAttr -is true -ci true -h true -sn "maskChannel_13_Name" -ln "maskChannel_13_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_13_Type" -ln "maskChannel_13_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_13" -ln "maskChannel_13" -nn "Channel 13 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_13R" -ln "maskChannel_13R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_13"; + addAttr -is true -ci true -sn "maskChannel_13G" -ln "maskChannel_13G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_13"; + addAttr -is true -ci true -sn "maskChannel_13B" -ln "maskChannel_13B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_13"; + addAttr -is true -ci true -h true -sn "maskWeight_07_Name" -ln "maskWeight_07_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_07_Type" -ln "maskWeight_07_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_07" -ln "maskWeight_07" -nn "Channel 07 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_08_Name" -ln "maskWeight_08_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_08_Type" -ln "maskWeight_08_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_08" -ln "maskWeight_08" -nn "Channel 08 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_14_Name" -ln "maskChannel_14_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_14_Type" -ln "maskChannel_14_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_14" -ln "maskChannel_14" -nn "Channel 14 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_14R" -ln "maskChannel_14R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_14"; + addAttr -is true -ci true -sn "maskChannel_14G" -ln "maskChannel_14G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_14"; + addAttr -is true -ci true -sn "maskChannel_14B" -ln "maskChannel_14B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_14"; + addAttr -is true -ci true -h true -sn "maskChannel_15_Name" -ln "maskChannel_15_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_15_Type" -ln "maskChannel_15_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_15" -ln "maskChannel_15" -nn "Channel 15 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_15R" -ln "maskChannel_15R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_15"; + addAttr -is true -ci true -sn "maskChannel_15G" -ln "maskChannel_15G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_15"; + addAttr -is true -ci true -sn "maskChannel_15B" -ln "maskChannel_15B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_15"; + addAttr -is true -ci true -h true -sn "maskWeight_09_Name" -ln "maskWeight_09_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_09_Type" -ln "maskWeight_09_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_09" -ln "maskWeight_09" -nn "Channel 09 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_16_Name" -ln "maskChannel_16_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_16_Type" -ln "maskChannel_16_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_16" -ln "maskChannel_16" -nn "Channel 16 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_16R" -ln "maskChannel_16R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_16"; + addAttr -is true -ci true -sn "maskChannel_16G" -ln "maskChannel_16G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_16"; + addAttr -is true -ci true -sn "maskChannel_16B" -ln "maskChannel_16B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_16"; + addAttr -is true -ci true -h true -sn "maskWeight_10_Name" -ln "maskWeight_10_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_10_Type" -ln "maskWeight_10_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_10" -ln "maskWeight_10" -nn "Channel 10 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_17_Name" -ln "maskChannel_17_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_17_Type" -ln "maskChannel_17_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_17" -ln "maskChannel_17" -nn "Channel 17 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_17R" -ln "maskChannel_17R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_17"; + addAttr -is true -ci true -sn "maskChannel_17G" -ln "maskChannel_17G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_17"; + addAttr -is true -ci true -sn "maskChannel_17B" -ln "maskChannel_17B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_17"; + addAttr -is true -ci true -h true -sn "maskWeight_11_Name" -ln "maskWeight_11_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_11_Type" -ln "maskWeight_11_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_11" -ln "maskWeight_11" -nn "Channel 11 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_12_Name" -ln "maskWeight_12_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_12_Type" -ln "maskWeight_12_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_12" -ln "maskWeight_12" -nn "Channel 12 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_18_Name" -ln "maskChannel_18_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_18_Type" -ln "maskChannel_18_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_18" -ln "maskChannel_18" -nn "Channel 18 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_18R" -ln "maskChannel_18R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_18"; + addAttr -is true -ci true -sn "maskChannel_18G" -ln "maskChannel_18G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_18"; + addAttr -is true -ci true -sn "maskChannel_18B" -ln "maskChannel_18B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_18"; + addAttr -is true -ci true -h true -sn "maskWeight_13_Name" -ln "maskWeight_13_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_13_Type" -ln "maskWeight_13_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_13" -ln "maskWeight_13" -nn "Channel 13 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_19_Name" -ln "maskChannel_19_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_19_Type" -ln "maskChannel_19_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_19" -ln "maskChannel_19" -nn "Channel 19 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_19R" -ln "maskChannel_19R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_19"; + addAttr -is true -ci true -sn "maskChannel_19G" -ln "maskChannel_19G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_19"; + addAttr -is true -ci true -sn "maskChannel_19B" -ln "maskChannel_19B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_19"; + addAttr -is true -ci true -h true -sn "maskWeight_14_Name" -ln "maskWeight_14_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_14_Type" -ln "maskWeight_14_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_14" -ln "maskWeight_14" -nn "Channel 14 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_20_Name" -ln "maskChannel_20_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_20_Type" -ln "maskChannel_20_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_20" -ln "maskChannel_20" -nn "Channel 20 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_20R" -ln "maskChannel_20R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_20"; + addAttr -is true -ci true -sn "maskChannel_20G" -ln "maskChannel_20G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_20"; + addAttr -is true -ci true -sn "maskChannel_20B" -ln "maskChannel_20B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_20"; + addAttr -is true -ci true -h true -sn "maskWeight_15_Name" -ln "maskWeight_15_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_15_Type" -ln "maskWeight_15_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_15" -ln "maskWeight_15" -nn "Channel 15 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_21_Name" -ln "maskChannel_21_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_21_Type" -ln "maskChannel_21_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_21" -ln "maskChannel_21" -nn "Channel 21 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_21R" -ln "maskChannel_21R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_21"; + addAttr -is true -ci true -sn "maskChannel_21G" -ln "maskChannel_21G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_21"; + addAttr -is true -ci true -sn "maskChannel_21B" -ln "maskChannel_21B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_21"; + addAttr -is true -ci true -h true -sn "maskWeight_16_Name" -ln "maskWeight_16_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_16_Type" -ln "maskWeight_16_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_16" -ln "maskWeight_16" -nn "Channel 16 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_22_Name" -ln "maskChannel_22_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_22_Type" -ln "maskChannel_22_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_22" -ln "maskChannel_22" -nn "Channel 22 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_22R" -ln "maskChannel_22R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_22"; + addAttr -is true -ci true -sn "maskChannel_22G" -ln "maskChannel_22G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_22"; + addAttr -is true -ci true -sn "maskChannel_22B" -ln "maskChannel_22B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_22"; + addAttr -is true -ci true -h true -sn "maskWeight_17_Name" -ln "maskWeight_17_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_17_Type" -ln "maskWeight_17_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_17" -ln "maskWeight_17" -nn "Channel 17 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_23_Name" -ln "maskChannel_23_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_23_Type" -ln "maskChannel_23_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_23" -ln "maskChannel_23" -nn "Channel 23 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_23R" -ln "maskChannel_23R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_23"; + addAttr -is true -ci true -sn "maskChannel_23G" -ln "maskChannel_23G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_23"; + addAttr -is true -ci true -sn "maskChannel_23B" -ln "maskChannel_23B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_23"; + addAttr -is true -ci true -h true -sn "maskWeight_18_Name" -ln "maskWeight_18_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_18_Type" -ln "maskWeight_18_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_18" -ln "maskWeight_18" -nn "Channel 18 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_24_Name" -ln "maskChannel_24_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_24_Type" -ln "maskChannel_24_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_24" -ln "maskChannel_24" -nn "Channel 24 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_24R" -ln "maskChannel_24R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_24"; + addAttr -is true -ci true -sn "maskChannel_24G" -ln "maskChannel_24G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_24"; + addAttr -is true -ci true -sn "maskChannel_24B" -ln "maskChannel_24B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_24"; + addAttr -is true -ci true -h true -sn "maskChannel_25_Name" -ln "maskChannel_25_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_25_Type" -ln "maskChannel_25_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_25" -ln "maskChannel_25" -nn "Channel 25 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_25R" -ln "maskChannel_25R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_25"; + addAttr -is true -ci true -sn "maskChannel_25G" -ln "maskChannel_25G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_25"; + addAttr -is true -ci true -sn "maskChannel_25B" -ln "maskChannel_25B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_25"; + addAttr -is true -ci true -h true -sn "maskWeight_19_Name" -ln "maskWeight_19_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_19_Type" -ln "maskWeight_19_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_19" -ln "maskWeight_19" -nn "Channel 19 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_20_Name" -ln "maskWeight_20_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_20_Type" -ln "maskWeight_20_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_20" -ln "maskWeight_20" -nn "Channel 20 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_26_Name" -ln "maskChannel_26_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_26_Type" -ln "maskChannel_26_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_26" -ln "maskChannel_26" -nn "Channel 26 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_26R" -ln "maskChannel_26R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_26"; + addAttr -is true -ci true -sn "maskChannel_26G" -ln "maskChannel_26G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_26"; + addAttr -is true -ci true -sn "maskChannel_26B" -ln "maskChannel_26B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_26"; + addAttr -is true -ci true -h true -sn "maskWeight_21_Name" -ln "maskWeight_21_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_21_Type" -ln "maskWeight_21_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_21" -ln "maskWeight_21" -nn "Channel 21 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_27_Name" -ln "maskChannel_27_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_27_Type" -ln "maskChannel_27_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_27" -ln "maskChannel_27" -nn "Channel 27 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_27R" -ln "maskChannel_27R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_27"; + addAttr -is true -ci true -sn "maskChannel_27G" -ln "maskChannel_27G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_27"; + addAttr -is true -ci true -sn "maskChannel_27B" -ln "maskChannel_27B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_27"; + addAttr -is true -ci true -h true -sn "maskWeight_22_Name" -ln "maskWeight_22_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_22_Type" -ln "maskWeight_22_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_22" -ln "maskWeight_22" -nn "Channel 22 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_28_Name" -ln "maskChannel_28_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_28_Type" -ln "maskChannel_28_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_28" -ln "maskChannel_28" -nn "Channel 28 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_28R" -ln "maskChannel_28R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_28"; + addAttr -is true -ci true -sn "maskChannel_28G" -ln "maskChannel_28G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_28"; + addAttr -is true -ci true -sn "maskChannel_28B" -ln "maskChannel_28B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_28"; + addAttr -is true -ci true -h true -sn "maskWeight_23_Name" -ln "maskWeight_23_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_23_Type" -ln "maskWeight_23_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_23" -ln "maskWeight_23" -nn "Channel 23 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_29_Name" -ln "maskChannel_29_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_29_Type" -ln "maskChannel_29_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_29" -ln "maskChannel_29" -nn "Channel 29 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_29R" -ln "maskChannel_29R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_29"; + addAttr -is true -ci true -sn "maskChannel_29G" -ln "maskChannel_29G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_29"; + addAttr -is true -ci true -sn "maskChannel_29B" -ln "maskChannel_29B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_29"; + addAttr -is true -ci true -h true -sn "maskChannel_30_Name" -ln "maskChannel_30_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_30_Type" -ln "maskChannel_30_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_30" -ln "maskChannel_30" -nn "Channel 30 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_30R" -ln "maskChannel_30R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_30"; + addAttr -is true -ci true -sn "maskChannel_30G" -ln "maskChannel_30G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_30"; + addAttr -is true -ci true -sn "maskChannel_30B" -ln "maskChannel_30B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_30"; + addAttr -is true -ci true -h true -sn "maskWeight_24_Name" -ln "maskWeight_24_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_24_Type" -ln "maskWeight_24_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_24" -ln "maskWeight_24" -nn "Channel 24 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_25_Name" -ln "maskWeight_25_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_25_Type" -ln "maskWeight_25_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_25" -ln "maskWeight_25" -nn "Channel 25 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_31_Name" -ln "maskChannel_31_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_31_Type" -ln "maskChannel_31_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_31" -ln "maskChannel_31" -nn "Channel 31 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_31R" -ln "maskChannel_31R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_31"; + addAttr -is true -ci true -sn "maskChannel_31G" -ln "maskChannel_31G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_31"; + addAttr -is true -ci true -sn "maskChannel_31B" -ln "maskChannel_31B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_31"; + addAttr -is true -ci true -h true -sn "maskWeight_26_Name" -ln "maskWeight_26_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_26_Type" -ln "maskWeight_26_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_26" -ln "maskWeight_26" -nn "Channel 26 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_32_Name" -ln "maskChannel_32_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_32_Type" -ln "maskChannel_32_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_32" -ln "maskChannel_32" -nn "Channel 32 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_32R" -ln "maskChannel_32R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_32"; + addAttr -is true -ci true -sn "maskChannel_32G" -ln "maskChannel_32G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_32"; + addAttr -is true -ci true -sn "maskChannel_32B" -ln "maskChannel_32B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_32"; + addAttr -is true -ci true -h true -sn "maskWeight_27_Name" -ln "maskWeight_27_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_27_Type" -ln "maskWeight_27_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_27" -ln "maskWeight_27" -nn "Channel 27 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_33_Name" -ln "maskChannel_33_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_33_Type" -ln "maskChannel_33_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_33" -ln "maskChannel_33" -nn "Channel 33 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_33R" -ln "maskChannel_33R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_33"; + addAttr -is true -ci true -sn "maskChannel_33G" -ln "maskChannel_33G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_33"; + addAttr -is true -ci true -sn "maskChannel_33B" -ln "maskChannel_33B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_33"; + addAttr -is true -ci true -h true -sn "maskWeight_28_Name" -ln "maskWeight_28_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_28_Type" -ln "maskWeight_28_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_28" -ln "maskWeight_28" -nn "Channel 28 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_34_Name" -ln "maskChannel_34_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_34_Type" -ln "maskChannel_34_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_34" -ln "maskChannel_34" -nn "Channel 34 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_34R" -ln "maskChannel_34R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_34"; + addAttr -is true -ci true -sn "maskChannel_34G" -ln "maskChannel_34G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_34"; + addAttr -is true -ci true -sn "maskChannel_34B" -ln "maskChannel_34B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_34"; + addAttr -is true -ci true -h true -sn "maskWeight_29_Name" -ln "maskWeight_29_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_29_Type" -ln "maskWeight_29_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_29" -ln "maskWeight_29" -nn "Channel 29 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_35_Name" -ln "maskChannel_35_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_35_Type" -ln "maskChannel_35_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_35" -ln "maskChannel_35" -nn "Channel 35 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_35R" -ln "maskChannel_35R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_35"; + addAttr -is true -ci true -sn "maskChannel_35G" -ln "maskChannel_35G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_35"; + addAttr -is true -ci true -sn "maskChannel_35B" -ln "maskChannel_35B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_35"; + addAttr -is true -ci true -h true -sn "maskWeight_30_Name" -ln "maskWeight_30_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_30_Type" -ln "maskWeight_30_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_30" -ln "maskWeight_30" -nn "Channel 30 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskChannel_36_Name" -ln "maskChannel_36_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskChannel_36_Type" -ln "maskChannel_36_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "maskChannel_36" -ln "maskChannel_36" -nn "Channel 36 Mask" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "maskChannel_36R" -ln "maskChannel_36R" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_36"; + addAttr -is true -ci true -sn "maskChannel_36G" -ln "maskChannel_36G" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_36"; + addAttr -is true -ci true -sn "maskChannel_36B" -ln "maskChannel_36B" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "maskChannel_36"; + addAttr -is true -ci true -h true -sn "maskWeight_31_Name" -ln "maskWeight_31_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_31_Type" -ln "maskWeight_31_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_31" -ln "maskWeight_31" -nn "Channel 31 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_32_Name" -ln "maskWeight_32_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_32_Type" -ln "maskWeight_32_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_32" -ln "maskWeight_32" -nn "Channel 32 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_33_Name" -ln "maskWeight_33_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_33_Type" -ln "maskWeight_33_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_33" -ln "maskWeight_33" -nn "Channel 33 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_34_Name" -ln "maskWeight_34_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_34_Type" -ln "maskWeight_34_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_34" -ln "maskWeight_34" -nn "Channel 34 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_35_Name" -ln "maskWeight_35_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_35_Type" -ln "maskWeight_35_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_35" -ln "maskWeight_35" -nn "Channel 35 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_36_Name" -ln "maskWeight_36_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_36_Type" -ln "maskWeight_36_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_36" -ln "maskWeight_36" -nn "Channel 36 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_37_Name" -ln "maskWeight_37_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_37_Type" -ln "maskWeight_37_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_37" -ln "maskWeight_37" -nn "Channel 37 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_38_Name" -ln "maskWeight_38_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_38_Type" -ln "maskWeight_38_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_38" -ln "maskWeight_38" -nn "Channel 38 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_39_Name" -ln "maskWeight_39_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_39_Type" -ln "maskWeight_39_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_39" -ln "maskWeight_39" -nn "Channel 39 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_40_Name" -ln "maskWeight_40_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_40_Type" -ln "maskWeight_40_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_40" -ln "maskWeight_40" -nn "Channel 40 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_41_Name" -ln "maskWeight_41_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_41_Type" -ln "maskWeight_41_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_41" -ln "maskWeight_41" -nn "Channel 41 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_42_Name" -ln "maskWeight_42_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_42_Type" -ln "maskWeight_42_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_42" -ln "maskWeight_42" -nn "Channel 42 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_43_Name" -ln "maskWeight_43_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_43_Type" -ln "maskWeight_43_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_43" -ln "maskWeight_43" -nn "Channel 43 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_44_Name" -ln "maskWeight_44_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_44_Type" -ln "maskWeight_44_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_44" -ln "maskWeight_44" -nn "Channel 44 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_45_Name" -ln "maskWeight_45_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_45_Type" -ln "maskWeight_45_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_45" -ln "maskWeight_45" -nn "Channel 45 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_46_Name" -ln "maskWeight_46_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_46_Type" -ln "maskWeight_46_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_46" -ln "maskWeight_46" -nn "Channel 46 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_47_Name" -ln "maskWeight_47_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_47_Type" -ln "maskWeight_47_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_47" -ln "maskWeight_47" -nn "Channel 47 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_48_Name" -ln "maskWeight_48_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_48_Type" -ln "maskWeight_48_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_48" -ln "maskWeight_48" -nn "Channel 48 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_49_Name" -ln "maskWeight_49_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_49_Type" -ln "maskWeight_49_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_49" -ln "maskWeight_49" -nn "Channel 49 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_50_Name" -ln "maskWeight_50_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_50_Type" -ln "maskWeight_50_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_50" -ln "maskWeight_50" -nn "Channel 50 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_51_Name" -ln "maskWeight_51_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_51_Type" -ln "maskWeight_51_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_51" -ln "maskWeight_51" -nn "Channel 51 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_52_Name" -ln "maskWeight_52_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_52_Type" -ln "maskWeight_52_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_52" -ln "maskWeight_52" -nn "Channel 52 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_53_Name" -ln "maskWeight_53_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_53_Type" -ln "maskWeight_53_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_53" -ln "maskWeight_53" -nn "Channel 53 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_54_Name" -ln "maskWeight_54_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_54_Type" -ln "maskWeight_54_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_54" -ln "maskWeight_54" -nn "Channel 54 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_55_Name" -ln "maskWeight_55_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_55_Type" -ln "maskWeight_55_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_55" -ln "maskWeight_55" -nn "Channel 55 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_56_Name" -ln "maskWeight_56_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_56_Type" -ln "maskWeight_56_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_56" -ln "maskWeight_56" -nn "Channel 56 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_57_Name" -ln "maskWeight_57_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_57_Type" -ln "maskWeight_57_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_57" -ln "maskWeight_57" -nn "Channel 57 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_58_Name" -ln "maskWeight_58_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_58_Type" -ln "maskWeight_58_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_58" -ln "maskWeight_58" -nn "Channel 58 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_59_Name" -ln "maskWeight_59_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_59_Type" -ln "maskWeight_59_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_59" -ln "maskWeight_59" -nn "Channel 59 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_60_Name" -ln "maskWeight_60_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_60_Type" -ln "maskWeight_60_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_60" -ln "maskWeight_60" -nn "Channel 60 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_61_Name" -ln "maskWeight_61_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_61_Type" -ln "maskWeight_61_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_61" -ln "maskWeight_61" -nn "Channel 61 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_62_Name" -ln "maskWeight_62_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_62_Type" -ln "maskWeight_62_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_62" -ln "maskWeight_62" -nn "Channel 62 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_63_Name" -ln "maskWeight_63_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_63_Type" -ln "maskWeight_63_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_63" -ln "maskWeight_63" -nn "Channel 63 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_64_Name" -ln "maskWeight_64_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_64_Type" -ln "maskWeight_64_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_64" -ln "maskWeight_64" -nn "Channel 64 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_65_Name" -ln "maskWeight_65_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_65_Type" -ln "maskWeight_65_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_65" -ln "maskWeight_65" -nn "Channel 65 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_66_Name" -ln "maskWeight_66_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_66_Type" -ln "maskWeight_66_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_66" -ln "maskWeight_66" -nn "Channel 66 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_67_Name" -ln "maskWeight_67_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_67_Type" -ln "maskWeight_67_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_67" -ln "maskWeight_67" -nn "Channel 67 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_68_Name" -ln "maskWeight_68_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_68_Type" -ln "maskWeight_68_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_68" -ln "maskWeight_68" -nn "Channel 68 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_69_Name" -ln "maskWeight_69_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_69_Type" -ln "maskWeight_69_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_69" -ln "maskWeight_69" -nn "Channel 69 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_70_Name" -ln "maskWeight_70_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_70_Type" -ln "maskWeight_70_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_70" -ln "maskWeight_70" -nn "Channel 70 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_71_Name" -ln "maskWeight_71_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_71_Type" -ln "maskWeight_71_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_71" -ln "maskWeight_71" -nn "Channel 71 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_72_Name" -ln "maskWeight_72_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_72_Type" -ln "maskWeight_72_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_72" -ln "maskWeight_72" -nn "Channel 72 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_73_Name" -ln "maskWeight_73_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_73_Type" -ln "maskWeight_73_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_73" -ln "maskWeight_73" -nn "Channel 73 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_74_Name" -ln "maskWeight_74_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_74_Type" -ln "maskWeight_74_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_74" -ln "maskWeight_74" -nn "Channel 74 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_75_Name" -ln "maskWeight_75_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_75_Type" -ln "maskWeight_75_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_75" -ln "maskWeight_75" -nn "Channel 75 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_76_Name" -ln "maskWeight_76_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_76_Type" -ln "maskWeight_76_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_76" -ln "maskWeight_76" -nn "Channel 76 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_77_Name" -ln "maskWeight_77_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_77_Type" -ln "maskWeight_77_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_77" -ln "maskWeight_77" -nn "Channel 77 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_78_Name" -ln "maskWeight_78_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_78_Type" -ln "maskWeight_78_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_78" -ln "maskWeight_78" -nn "Channel 78 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_79_Name" -ln "maskWeight_79_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_79_Type" -ln "maskWeight_79_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_79" -ln "maskWeight_79" -nn "Channel 79 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_80_Name" -ln "maskWeight_80_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_80_Type" -ln "maskWeight_80_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_80" -ln "maskWeight_80" -nn "Channel 80 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "maskWeight_81_Name" -ln "maskWeight_81_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "maskWeight_81_Type" -ln "maskWeight_81_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "maskWeight_81" -ln "maskWeight_81" -nn "Channel 81 Multiplier" + -ct "HW_shader_parameter" -min 0 -smx 1 -at "float"; + setAttr ".vpar" -type "stringArray" 7 "Position" "TexCoord0" "TexCoord1" "TexCoord2" "Normal" "Binormal0" "Tangent0" ; + setAttr ".upar" -type "stringArray" 249 "light0Enable" "light0Type" "light0Pos" "light0Color" "light0Intensity" "light0Dir" "light0ConeAngle" "light0FallOff" "light0AttenScale" "light0ShadowOn" "light1Enable" "light1Type" "light1Pos" "light1Color" "light1Intensity" "light1Dir" "light1ConeAngle" "light1FallOff" "light1AttenScale" "light1ShadowOn" "light2Enable" "light2Type" "light2Pos" "light2Color" "light2Intensity" "light2Dir" "light2ConeAngle" "light2FallOff" "light2AttenScale" "light2ShadowOn" "SuperFilterTaps" "shadowMapTexelSize" "IsSwatchRender" "screenSize" "MayaFullScreenGamma" "LinearSpaceLighting" "UseShadows" "shadowMultiplier" "shadowDepthBias" "flipBackfaceNormals" "SkyRotation" "UseDiffuseIBLMap" "DiffuseIBLIntensity" "DiffuseCubeIBL" "UseSpecCubeIBL" "SpecularIBLIntensity" "SpecularCubeIBL" "UseDiffuseTexture" "UseDiffuseTextureAlpha" "DiffuseTexture" "DiffuseColor" "LutTexture" "DitherTexture" "skinCoeffX" "skinCoeffY" "skinCoeffZ" "NormalBlurring" "UseScatteringRadiusTexture" "ScatteringRadiusTexture" "skinScattering" "shadowDither" "shadowBlur" "shadowScattering" "shadowSaturation" "UseTranslucency" "BackScatteringThicknessTexture" "UseThicknessTexture" "skinScatteringRoughness" "skinScatteringOuterColor" "skinScatteringAmount" "skinAmbientScatteringAmount" "transpDepthTexture" "opaqueDepthTexture" "UseSpecularTexture" "UseSpecularTextureAlpha" "SpecularTexture" "SpecularColor" "LobeMix" "Roughness" "UseAmbientOcclusionTexture" "OcclusionTexture" "OcclusionAmount" "UseCavityTexture" "CavityTexture" "CavityAmount" "UseNormalTexture" "NormalTexture" "NormalHeight" "SupportNonUniformScale" "NormalCoordsysX" "NormalCoordsysY" "UseMicroCavityTexture" "MicroCavityTexture" "MicroCavityAmount" "UseMicroNormalTexture" "MicroNormalTexture" "MicroNormalHeight" "MicroScale" "OpacityMaskTexture" "Opacity" "UseOpacityMaskTexture" "OpacityMaskBias" "DisplacementModel" "UseDisplacementMap" "DisplacementTexture" "VectorDisplacementCoordSys" "DisplacementHeight" "DisplacementOffset" "DisplacementClippingBias" "BBoxExtraScale" "TessellationRange" "TessellationMin" "FlatTessellation" "UseBlendTexture" "animNormalMap_00" "maskChannel_00" "maskChannel_01" "animNormalMap_01" "maskChannel_02" "animNormalMap_02" "maskChannel_03" "animColorMap_00" "maskChannel_04" "animColorMap_01" "animColorMap_02" "maskChannel_05" "maskWeight_00" "maskChannel_06" "maskWeight_01" "maskChannel_07" "maskWeight_02" "maskChannel_08" "maskChannel_09" "maskWeight_03" "maskChannel_10" "maskWeight_04" "maskWeight_05" "maskChannel_11" "maskWeight_06" "maskChannel_12" "maskChannel_13" "maskWeight_07" "maskWeight_08" "maskChannel_14" "maskChannel_15" "maskWeight_09" "maskChannel_16" "maskWeight_10" "maskChannel_17" "maskWeight_11" "maskWeight_12" "maskChannel_18" "maskWeight_13" "maskChannel_19" "maskWeight_14" "maskChannel_20" "maskWeight_15" "maskChannel_21" "maskWeight_16" "maskChannel_22" "maskWeight_17" "maskChannel_23" "maskWeight_18" "maskChannel_24" "maskChannel_25" "maskWeight_19" "maskWeight_20" "maskChannel_26" "maskWeight_21" "maskChannel_27" "maskWeight_22" "maskChannel_28" "maskWeight_23" "maskChannel_29" "maskChannel_30" "maskWeight_24" "maskWeight_25" "maskChannel_31" "maskWeight_26" "maskChannel_32" "maskWeight_27" "maskChannel_33" "maskWeight_28" "maskChannel_34" "maskWeight_29" "maskChannel_35" "maskWeight_30" "maskChannel_36" "maskWeight_31" "maskWeight_32" "maskWeight_33" "maskWeight_34" "maskWeight_35" "maskWeight_36" "maskWeight_37" "maskWeight_38" "maskWeight_39" "maskWeight_40" "maskWeight_41" "maskWeight_42" "maskWeight_43" "maskWeight_44" "maskWeight_45" "maskWeight_46" "maskWeight_47" "maskWeight_48" "maskWeight_49" "maskWeight_50" "maskWeight_51" "maskWeight_52" "maskWeight_53" "maskWeight_54" "maskWeight_55" "maskWeight_56" "maskWeight_57" "maskWeight_58" "maskWeight_59" "maskWeight_60" "maskWeight_61" "maskWeight_62" "maskWeight_63" "maskWeight_64" "maskWeight_65" "maskWeight_66" "maskWeight_67" "maskWeight_68" "maskWeight_69" "maskWeight_70" "maskWeight_71" "maskWeight_72" "maskWeight_73" "maskWeight_74" "maskWeight_75" "maskWeight_76" "maskWeight_77" "maskWeight_78" "maskWeight_79" "maskWeight_80" "maskWeight_81" "DiffuseTexcoord" "OcclusionTexcoord" "OpacityMaskTexcoord" "SpecularTexcoord" "NormalTexcoord" "DisplacementTexcoord" "ThicknessTexcoord" "light0ShadowMap" "light1ShadowMap" "light2ShadowMap" ; + setAttr ".s" -type "string" "$PROJECT_ROOT/Common/SourceAssets/shaders/dx11_shd_head.fx"; + setAttr ".t" -type "string" "TessellationOFF"; + setAttr ".SuperFilterTaps_Name" -type "string" "SuperFilterTaps"; + setAttr ".SuperFilterTaps_Type" -type "string" "float1x2"; + setAttr ".SuperFilterTaps" -type "float2" -0.84052002 -0.073954001 ; + setAttr ".shadowMapTexelSize_Name" -type "string" "shadowMapTexelSize"; + setAttr ".shadowMapTexelSize_Type" -type "string" "float"; + setAttr ".shadowMapTexelSize" 0.0019531298894435167; + setAttr ".LinearSpaceLighting_Name" -type "string" "LinearSpaceLighting"; + setAttr ".LinearSpaceLighting_Type" -type "string" "bool"; + setAttr -k on ".LinearSpaceLighting" yes; + setAttr ".UseShadows_Name" -type "string" "UseShadows"; + setAttr ".UseShadows_Type" -type "string" "bool"; + setAttr -k on ".UseShadows" yes; + setAttr ".shadowMultiplier_Name" -type "string" "shadowMultiplier"; + setAttr ".shadowMultiplier_Type" -type "string" "float"; + setAttr -k on ".shadowMultiplier" 1; + setAttr ".IsSwatchRender_Name" -type "string" "IsSwatchRender"; + setAttr ".IsSwatchRender_Type" -type "string" "bool"; + setAttr ".IsSwatchRender" no; + setAttr ".shadowDepthBias_Name" -type "string" "shadowDepthBias"; + setAttr ".shadowDepthBias_Type" -type "string" "float"; + setAttr -k on ".shadowDepthBias" 0.0099999997764825821; + setAttr ".MayaFullScreenGamma_Name" -type "string" "MayaFullScreenGamma"; + setAttr ".MayaFullScreenGamma_Type" -type "string" "bool"; + setAttr ".MayaFullScreenGamma" no; + setAttr ".flipBackfaceNormals_Name" -type "string" "flipBackfaceNormals"; + setAttr ".flipBackfaceNormals_Type" -type "string" "bool"; + setAttr -k on ".flipBackfaceNormals" yes; + setAttr ".light0Enable_Name" -type "string" "light0Enable"; + setAttr ".light0Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light0Enable" no; + setAttr ".light0Type_Name" -type "string" "light0Type"; + setAttr ".light0Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light0Type" 2; + setAttr ".light0Pos_Name" -type "string" "light0Pos"; + setAttr ".light0Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 100 1; + setAttr ".light0Color_Name" -type "string" "light0Color"; + setAttr ".light0Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light0Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light0Color"; + setAttr ".light0Intensity_Name" -type "string" "light0Intensity"; + setAttr ".light0Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light0Intensity" 1; + setAttr ".light0Dir_Name" -type "string" "light0Dir"; + setAttr ".light0Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light0ConeAngle_Name" -type "string" "light0ConeAngle"; + setAttr ".light0ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light0ConeAngle" 0.46000000834465027; + setAttr ".light0FallOff_Name" -type "string" "light0FallOff"; + setAttr ".light0FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light0FallOff" 0.69999998807907104; + setAttr ".light0AttenScale_Name" -type "string" "light0AttenScale"; + setAttr ".light0AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light0AttenScale" 0; + setAttr ".light0ShadowOn_Name" -type "string" "light0ShadowOn"; + setAttr ".light0ShadowOn_Type" -type "string" "bool"; + setAttr ".light0ShadowOn" yes; + setAttr ".light1Enable_Name" -type "string" "light1Enable"; + setAttr ".light1Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light1Enable" no; + setAttr ".light1Type_Name" -type "string" "light1Type"; + setAttr ".light1Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light1Type" 2; + setAttr ".light1Pos_Name" -type "string" "light1Pos"; + setAttr ".light1Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 -100 100 100 1; + setAttr ".light1Color_Name" -type "string" "light1Color"; + setAttr ".light1Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light1Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light1Color"; + setAttr ".light1Intensity_Name" -type "string" "light1Intensity"; + setAttr ".light1Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light1Intensity" 1; + setAttr ".light1Dir_Name" -type "string" "light1Dir"; + setAttr ".light1Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light1ConeAngle_Name" -type "string" "light1ConeAngle"; + setAttr ".light1ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light1ConeAngle" 45; + setAttr ".light1FallOff_Name" -type "string" "light1FallOff"; + setAttr ".light1FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light1FallOff" 0; + setAttr ".light1AttenScale_Name" -type "string" "light1AttenScale"; + setAttr ".light1AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light1AttenScale" 0; + setAttr ".light1ShadowOn_Name" -type "string" "light1ShadowOn"; + setAttr ".light1ShadowOn_Type" -type "string" "bool"; + setAttr ".light1ShadowOn" yes; + setAttr ".light2Enable_Name" -type "string" "light2Enable"; + setAttr ".light2Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light2Enable" no; + setAttr ".light2Type_Name" -type "string" "light2Type"; + setAttr ".light2Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light2Type" 2; + setAttr ".light2Pos_Name" -type "string" "light2Pos"; + setAttr ".light2Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 -100 1; + setAttr ".light2Color_Name" -type "string" "light2Color"; + setAttr ".light2Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light2Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light2Color"; + setAttr ".light2Intensity_Name" -type "string" "light2Intensity"; + setAttr ".light2Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light2Intensity" 1; + setAttr ".light2Dir_Name" -type "string" "light2Dir"; + setAttr ".light2Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light2ConeAngle_Name" -type "string" "light2ConeAngle"; + setAttr ".light2ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light2ConeAngle" 45; + setAttr ".light2FallOff_Name" -type "string" "light2FallOff"; + setAttr ".light2FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light2FallOff" 0; + setAttr ".light2AttenScale_Name" -type "string" "light2AttenScale"; + setAttr ".light2AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light2AttenScale" 0; + setAttr ".light2ShadowOn_Name" -type "string" "light2ShadowOn"; + setAttr ".light2ShadowOn_Type" -type "string" "bool"; + setAttr ".light2ShadowOn" yes; + setAttr ".UseAmbientOcclusionTexture_Name" -type "string" "UseAmbientOcclusionTexture"; + setAttr ".UseAmbientOcclusionTexture_Type" -type "string" "bool"; + setAttr -k on ".UseAmbientOcclusionTexture" yes; + setAttr ".transpDepthTexture_Name" -type "string" "transpDepthTexture"; + setAttr ".transpDepthTexture_Type" -type "string" "texture"; + setAttr ".transpDepthTexture" -type "float3" 0 0 0 ; + setAttr ".opaqueDepthTexture_Name" -type "string" "opaqueDepthTexture"; + setAttr ".opaqueDepthTexture_Type" -type "string" "texture"; + setAttr ".opaqueDepthTexture" -type "float3" 0 0 0 ; + setAttr ".UseDiffuseTexture_Name" -type "string" "UseDiffuseTexture"; + setAttr ".UseDiffuseTexture_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTexture" yes; + setAttr ".UseDiffuseTextureAlpha_Name" -type "string" "UseDiffuseTextureAlpha"; + setAttr ".UseDiffuseTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTextureAlpha" no; + setAttr ".DiffuseTexture_Name" -type "string" "DiffuseTexture"; + setAttr ".DiffuseTexture_Type" -type "string" "texture"; + setAttr ".DiffuseTexture" -type "float3" 0 0 0 ; + setAttr ".DiffuseColor_Name" -type "string" "DiffuseColor"; + setAttr ".DiffuseColor_Type" -type "string" "color1x3"; + setAttr -k on ".DiffuseColor" -type "float3" 1 1 1 ; + setAttr ".Opacity_Name" -type "string" "Opacity"; + setAttr ".Opacity_Type" -type "string" "float"; + setAttr -k on ".Opacity" 1; + setAttr ".UseOpacityMaskTexture_Name" -type "string" "UseOpacityMaskTexture"; + setAttr ".UseOpacityMaskTexture_Type" -type "string" "bool"; + setAttr -k on ".UseOpacityMaskTexture" no; + setAttr ".OpacityMaskTexture_Name" -type "string" "OpacityMaskTexture"; + setAttr ".OpacityMaskTexture_Type" -type "string" "texture"; + setAttr ".OpacityMaskTexture" -type "float3" 0 0 0 ; + setAttr ".OpacityMaskBias_Name" -type "string" "OpacityMaskBias"; + setAttr ".OpacityMaskBias_Type" -type "string" "float"; + setAttr -k on ".OpacityMaskBias" 0.10000000149011612; + setAttr ".UseSpecularTexture_Name" -type "string" "UseSpecularTexture"; + setAttr ".UseSpecularTexture_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTexture" yes; + setAttr ".SpecularTexture_Name" -type "string" "SpecularTexture"; + setAttr ".SpecularTexture_Type" -type "string" "texture"; + setAttr ".SpecularTexture" -type "float3" 0 0 0 ; + setAttr ".SpecularColor_Name" -type "string" "SpecularColor"; + setAttr ".SpecularColor_Type" -type "string" "color1x3"; + setAttr -k on ".SpecularColor" -type "float3" 0.56862748 0.56862748 0.56862748 ; + setAttr ".UseNormalTexture_Name" -type "string" "UseNormalTexture"; + setAttr ".UseNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseNormalTexture" yes; + setAttr ".NormalTexture_Name" -type "string" "NormalTexture"; + setAttr ".NormalTexture_Type" -type "string" "texture"; + setAttr ".NormalTexture" -type "float3" 0 0 0 ; + setAttr ".NormalHeight_Name" -type "string" "NormalHeight"; + setAttr ".NormalHeight_Type" -type "string" "float"; + setAttr -k on ".NormalHeight" 1; + setAttr ".SupportNonUniformScale_Name" -type "string" "SupportNonUniformScale"; + setAttr ".SupportNonUniformScale_Type" -type "string" "bool"; + setAttr -k on ".SupportNonUniformScale" yes; + setAttr ".NormalCoordsysX_Name" -type "string" "NormalCoordsysX"; + setAttr ".NormalCoordsysX_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysX" 0; + setAttr ".NormalCoordsysY_Name" -type "string" "NormalCoordsysY"; + setAttr ".NormalCoordsysY_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysY" 1; + setAttr ".DisplacementModel_Name" -type "string" "DisplacementModel"; + setAttr ".DisplacementModel_Type" -type "string" "enum"; + setAttr -k on ".DisplacementModel" 0; + setAttr ".UseDisplacementMap_Name" -type "string" "UseDisplacementMap"; + setAttr ".UseDisplacementMap_Type" -type "string" "bool"; + setAttr -k on ".UseDisplacementMap" no; + setAttr ".DisplacementTexture_Name" -type "string" "DisplacementTexture"; + setAttr ".DisplacementTexture_Type" -type "string" "texture"; + setAttr ".DisplacementTexture" -type "float3" 0 0 0 ; + setAttr ".VectorDisplacementCoordSys_Name" -type "string" "VectorDisplacementCoordSys"; + setAttr ".VectorDisplacementCoordSys_Type" -type "string" "enum"; + setAttr -k on ".VectorDisplacementCoordSys" 0; + setAttr ".DisplacementHeight_Name" -type "string" "DisplacementHeight"; + setAttr ".DisplacementHeight_Type" -type "string" "float"; + setAttr -k on ".DisplacementHeight" 0.5; + setAttr ".DisplacementOffset_Name" -type "string" "DisplacementOffset"; + setAttr ".DisplacementOffset_Type" -type "string" "float"; + setAttr -k on ".DisplacementOffset" 0.5; + setAttr ".DisplacementClippingBias_Name" -type "string" "DisplacementClippingBias"; + setAttr ".DisplacementClippingBias_Type" -type "string" "float"; + setAttr -k on ".DisplacementClippingBias" 5; + setAttr ".BBoxExtraScale_Name" -type "string" "BBoxExtraScale"; + setAttr ".BBoxExtraScale_Type" -type "string" "float"; + setAttr -k on ".BBoxExtraScale" 1; + setAttr ".TessellationRange_Name" -type "string" "TessellationRange"; + setAttr ".TessellationRange_Type" -type "string" "float"; + setAttr -k on ".TessellationRange" 0; + setAttr ".TessellationMin_Name" -type "string" "TessellationMin"; + setAttr ".TessellationMin_Type" -type "string" "float"; + setAttr -k on ".TessellationMin" 3; + setAttr ".FlatTessellation_Name" -type "string" "FlatTessellation"; + setAttr ".FlatTessellation_Type" -type "string" "float"; + setAttr -k on ".FlatTessellation" 0; + setAttr ".UseTranslucency_Name" -type "string" "UseTranslucency"; + setAttr ".UseTranslucency_Type" -type "string" "bool"; + setAttr -k on ".UseTranslucency" yes; + setAttr ".UseThicknessTexture_Name" -type "string" "UseThicknessTexture"; + setAttr ".UseThicknessTexture_Type" -type "string" "bool"; + setAttr -k on ".UseThicknessTexture" yes; + setAttr ".UseDiffuseIBLMap_Name" -type "string" "UseDiffuseIBLMap"; + setAttr ".UseDiffuseIBLMap_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseIBLMap" yes; + setAttr ".DiffuseIBLIntensity_Name" -type "string" "DiffuseIBLIntensity"; + setAttr ".DiffuseIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".DiffuseIBLIntensity" 0.64999997615814209; + setAttr ".DiffuseTexcoord_Name" -type "string" "DiffuseTexcoord"; + setAttr ".DiffuseTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DiffuseTexcoord" 0; + setAttr ".OpacityMaskTexcoord_Name" -type "string" "OpacityMaskTexcoord"; + setAttr ".OpacityMaskTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OpacityMaskTexcoord" 0; + setAttr ".SpecularTexcoord_Name" -type "string" "SpecularTexcoord"; + setAttr ".SpecularTexcoord_Type" -type "string" "enum"; + setAttr -k on ".SpecularTexcoord" 0; + setAttr ".NormalTexcoord_Name" -type "string" "NormalTexcoord"; + setAttr ".NormalTexcoord_Type" -type "string" "enum"; + setAttr -k on ".NormalTexcoord" 0; + setAttr ".DisplacementTexcoord_Name" -type "string" "DisplacementTexcoord"; + setAttr ".DisplacementTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DisplacementTexcoord" 0; + setAttr ".ThicknessTexcoord_Name" -type "string" "ThicknessTexcoord"; + setAttr ".ThicknessTexcoord_Type" -type "string" "enum"; + setAttr -k on ".ThicknessTexcoord" 0; + setAttr ".light0ShadowMap_Name" -type "string" "light0ShadowMap"; + setAttr ".light0ShadowMap_Type" -type "string" "texture"; + setAttr ".light0ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light1ShadowMap_Name" -type "string" "light1ShadowMap"; + setAttr ".light1ShadowMap_Type" -type "string" "texture"; + setAttr ".light1ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light2ShadowMap_Name" -type "string" "light2ShadowMap"; + setAttr ".light2ShadowMap_Type" -type "string" "texture"; + setAttr ".light2ShadowMap" -type "float3" 0 0 0 ; + setAttr ".screenSize_Name" -type "string" "screenSize"; + setAttr ".screenSize_Type" -type "string" "float1x2"; + setAttr ".screenSize" -type "float2" 0 0 ; + setAttr ".SkyRotation_Name" -type "string" "SkyRotation"; + setAttr ".SkyRotation_Type" -type "string" "float"; + setAttr -k on ".SkyRotation" 12.5; + setAttr ".DiffuseCubeIBL_Name" -type "string" "DiffuseCubeIBL"; + setAttr ".DiffuseCubeIBL_Type" -type "string" "texture"; + setAttr ".DiffuseCubeIBL" -type "float3" 0 0 0 ; + setAttr ".UseSpecCubeIBL_Name" -type "string" "UseSpecCubeIBL"; + setAttr ".UseSpecCubeIBL_Type" -type "string" "bool"; + setAttr -k on ".UseSpecCubeIBL" yes; + setAttr ".SpecularIBLIntensity_Name" -type "string" "SpecularIBLIntensity"; + setAttr ".SpecularIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".SpecularIBLIntensity" 1.1847133636474609; + setAttr ".SpecularCubeIBL_Name" -type "string" "SpecularCubeIBL"; + setAttr ".SpecularCubeIBL_Type" -type "string" "texture"; + setAttr ".SpecularCubeIBL" -type "float3" 0 0 0 ; + setAttr ".LutTexture_Name" -type "string" "LutTexture"; + setAttr ".LutTexture_Type" -type "string" "texture"; + setAttr ".LutTexture" -type "float3" 0 0 0 ; + setAttr ".DitherTexture_Name" -type "string" "DitherTexture"; + setAttr ".DitherTexture_Type" -type "string" "texture"; + setAttr ".DitherTexture" -type "float3" 0 0 0 ; + setAttr ".skinCoeffX_Name" -type "string" "skinCoeffX"; + setAttr ".skinCoeffX_Type" -type "string" "float"; + setAttr -k on ".skinCoeffX" 0.79500001668930054; + setAttr ".skinCoeffY_Name" -type "string" "skinCoeffY"; + setAttr ".skinCoeffY_Type" -type "string" "float"; + setAttr -k on ".skinCoeffY" 0.28799998760223389; + setAttr ".skinCoeffZ_Name" -type "string" "skinCoeffZ"; + setAttr ".skinCoeffZ_Type" -type "string" "float"; + setAttr -k on ".skinCoeffZ" 0.030999999493360519; + setAttr ".NormalBlurring_Name" -type "string" "NormalBlurring"; + setAttr ".NormalBlurring_Type" -type "string" "float"; + setAttr -k on ".NormalBlurring" 1; + setAttr ".UseScatteringRadiusTexture_Name" -type "string" "UseScatteringRadiusTexture"; + setAttr ".UseScatteringRadiusTexture_Type" -type "string" "bool"; + setAttr -k on ".UseScatteringRadiusTexture" no; + setAttr ".ScatteringRadiusTexture_Name" -type "string" "ScatteringRadiusTexture"; + setAttr ".ScatteringRadiusTexture_Type" -type "string" "texture"; + setAttr ".ScatteringRadiusTexture" -type "float3" 0 0 0 ; + setAttr ".skinScattering_Name" -type "string" "skinScattering"; + setAttr ".skinScattering_Type" -type "string" "float"; + setAttr -k on ".skinScattering" 0.38999998569488525; + setAttr ".shadowDither_Name" -type "string" "shadowDither"; + setAttr ".shadowDither_Type" -type "string" "float"; + setAttr -k on ".shadowDither" 0.086999997496604919; + setAttr ".shadowBlur_Name" -type "string" "shadowBlur"; + setAttr ".shadowBlur_Type" -type "string" "float"; + setAttr -k on ".shadowBlur" 1; + setAttr ".shadowScattering_Name" -type "string" "shadowScattering"; + setAttr ".shadowScattering_Type" -type "string" "float"; + setAttr -k on ".shadowScattering" 1; + setAttr ".shadowSaturation_Name" -type "string" "shadowSaturation"; + setAttr ".shadowSaturation_Type" -type "string" "float"; + setAttr -k on ".shadowSaturation" 1.2740000486373901; + setAttr ".BackScatteringThicknessTexture_Name" -type "string" "BackScatteringThicknessTexture"; + setAttr ".BackScatteringThicknessTexture_Type" -type "string" "texture"; + setAttr ".BackScatteringThicknessTexture" -type "float3" 0 0 0 ; + setAttr ".skinScatteringRoughness_Name" -type "string" "skinScatteringRoughness"; + setAttr ".skinScatteringRoughness_Type" -type "string" "float"; + setAttr -k on ".skinScatteringRoughness" 1; + setAttr ".skinScatteringOuterColor_Name" -type "string" "skinScatteringOuterColor"; + setAttr ".skinScatteringOuterColor_Type" -type "string" "color1x3"; + setAttr -k on ".skinScatteringOuterColor" -type "float3" 0.39607844 0.039215688 + 0 ; + setAttr ".skinScatteringAmount_Name" -type "string" "skinScatteringAmount"; + setAttr ".skinScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinScatteringAmount" 0.30000001192092896; + setAttr ".skinAmbientScatteringAmount_Name" -type "string" "skinAmbientScatteringAmount"; + setAttr ".skinAmbientScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinAmbientScatteringAmount" 0.76433122158050537; + setAttr ".UseSpecularTextureAlpha_Name" -type "string" "UseSpecularTextureAlpha"; + setAttr ".UseSpecularTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTextureAlpha" no; + setAttr ".LobeMix_Name" -type "string" "LobeMix"; + setAttr ".LobeMix_Type" -type "string" "float"; + setAttr -k on ".LobeMix" 0.57099997997283936; + setAttr ".Roughness_Name" -type "string" "Roughness"; + setAttr ".Roughness_Type" -type "string" "float"; + setAttr -k on ".Roughness" 0.49000000953674316; + setAttr ".OcclusionTexture_Name" -type "string" "OcclusionTexture"; + setAttr ".OcclusionTexture_Type" -type "string" "texture"; + setAttr ".OcclusionTexture" -type "float3" 0 0 0 ; + setAttr ".OcclusionAmount_Name" -type "string" "OcclusionAmount"; + setAttr ".OcclusionAmount_Type" -type "string" "float"; + setAttr -k on ".OcclusionAmount" 0.5; + setAttr ".UseCavityTexture_Name" -type "string" "UseCavityTexture"; + setAttr ".UseCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseCavityTexture" yes; + setAttr ".CavityTexture_Name" -type "string" "CavityTexture"; + setAttr ".CavityTexture_Type" -type "string" "texture"; + setAttr ".CavityTexture" -type "float3" 0 0 0 ; + setAttr ".CavityAmount_Name" -type "string" "CavityAmount"; + setAttr ".CavityAmount_Type" -type "string" "float"; + setAttr -k on ".CavityAmount" 1; + setAttr ".UseMicroCavityTexture_Name" -type "string" "UseMicroCavityTexture"; + setAttr ".UseMicroCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroCavityTexture" no; + setAttr ".MicroCavityTexture_Name" -type "string" "MicroCavityTexture"; + setAttr ".MicroCavityTexture_Type" -type "string" "texture"; + setAttr ".MicroCavityTexture" -type "float3" 0 0 0 ; + setAttr ".MicroCavityAmount_Name" -type "string" "MicroCavityAmount"; + setAttr ".MicroCavityAmount_Type" -type "string" "float"; + setAttr -k on ".MicroCavityAmount" 1; + setAttr ".UseMicroNormalTexture_Name" -type "string" "UseMicroNormalTexture"; + setAttr ".UseMicroNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroNormalTexture" no; + setAttr ".MicroNormalTexture_Name" -type "string" "MicroNormalTexture"; + setAttr ".MicroNormalTexture_Type" -type "string" "texture"; + setAttr ".MicroNormalTexture" -type "float3" 0 0 0 ; + setAttr ".MicroNormalHeight_Name" -type "string" "MicroNormalHeight"; + setAttr ".MicroNormalHeight_Type" -type "string" "float"; + setAttr -k on ".MicroNormalHeight" 1; + setAttr ".MicroScale_Name" -type "string" "MicroScale"; + setAttr ".MicroScale_Type" -type "string" "float"; + setAttr -k on ".MicroScale" 32; + setAttr ".UseBlendTexture_Name" -type "string" "UseBlendTexture"; + setAttr ".UseBlendTexture_Type" -type "string" "bool"; + setAttr -k on ".UseBlendTexture" yes; + setAttr ".OcclusionTexcoord_Name" -type "string" "OcclusionTexcoord"; + setAttr ".OcclusionTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OcclusionTexcoord" 1; + setAttr ".Position_Name" -type "string" "Position"; + setAttr ".Position_Source" -type "string" "position"; + setAttr ".TexCoord0_Name" -type "string" "TexCoord0"; + setAttr ".TexCoord0_Source" -type "string" "uv:map1"; + setAttr ".TexCoord0_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord1_Name" -type "string" "TexCoord1"; + setAttr ".TexCoord1_Source" -type "string" "uv:map2"; + setAttr ".TexCoord1_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord2_Name" -type "string" "TexCoord2"; + setAttr ".TexCoord2_Source" -type "string" "uv:map3"; + setAttr ".TexCoord2_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".Normal_Name" -type "string" "Normal"; + setAttr ".Normal_Source" -type "string" "normal"; + setAttr ".Binormal0_Name" -type "string" "Binormal0"; + setAttr ".Binormal0_Source" -type "string" "binormal:map1"; + setAttr ".Tangent0_Name" -type "string" "Tangent0"; + setAttr ".Tangent0_Source" -type "string" "tangent:map1"; + setAttr ".animNormalMap_00_Name" -type "string" "animNormalMap_00"; + setAttr ".animNormalMap_00_Type" -type "string" "texture"; + setAttr ".animNormalMap_00" -type "float3" 0 0 0 ; + setAttr ".maskChannel_00_Name" -type "string" "maskChannel_00"; + setAttr ".maskChannel_00_Type" -type "string" "texture"; + setAttr ".maskChannel_00" -type "float3" 0 0 0 ; + setAttr ".maskChannel_01_Name" -type "string" "maskChannel_01"; + setAttr ".maskChannel_01_Type" -type "string" "texture"; + setAttr ".maskChannel_01" -type "float3" 0 0 0 ; + setAttr ".animNormalMap_01_Name" -type "string" "animNormalMap_01"; + setAttr ".animNormalMap_01_Type" -type "string" "texture"; + setAttr ".animNormalMap_01" -type "float3" 0 0 0 ; + setAttr ".maskChannel_02_Name" -type "string" "maskChannel_02"; + setAttr ".maskChannel_02_Type" -type "string" "texture"; + setAttr ".maskChannel_02" -type "float3" 0 0 0 ; + setAttr ".animNormalMap_02_Name" -type "string" "animNormalMap_02"; + setAttr ".animNormalMap_02_Type" -type "string" "texture"; + setAttr ".animNormalMap_02" -type "float3" 0 0 0 ; + setAttr ".maskChannel_03_Name" -type "string" "maskChannel_03"; + setAttr ".maskChannel_03_Type" -type "string" "texture"; + setAttr ".maskChannel_03" -type "float3" 0 0 0 ; + setAttr ".animColorMap_00_Name" -type "string" "animColorMap_00"; + setAttr ".animColorMap_00_Type" -type "string" "texture"; + setAttr ".animColorMap_00" -type "float3" 0 0 0 ; + setAttr ".maskChannel_04_Name" -type "string" "maskChannel_04"; + setAttr ".maskChannel_04_Type" -type "string" "texture"; + setAttr ".maskChannel_04" -type "float3" 0 0 0 ; + setAttr ".animColorMap_01_Name" -type "string" "animColorMap_01"; + setAttr ".animColorMap_01_Type" -type "string" "texture"; + setAttr ".animColorMap_01" -type "float3" 0 0 0 ; + setAttr ".animColorMap_02_Name" -type "string" "animColorMap_02"; + setAttr ".animColorMap_02_Type" -type "string" "texture"; + setAttr ".animColorMap_02" -type "float3" 0 0 0 ; + setAttr ".maskChannel_05_Name" -type "string" "maskChannel_05"; + setAttr ".maskChannel_05_Type" -type "string" "texture"; + setAttr ".maskChannel_05" -type "float3" 0 0 0 ; + setAttr ".maskWeight_00_Name" -type "string" "maskWeight_00"; + setAttr ".maskWeight_00_Type" -type "string" "float"; + setAttr -k on ".maskWeight_00" 0; + setAttr ".maskChannel_06_Name" -type "string" "maskChannel_06"; + setAttr ".maskChannel_06_Type" -type "string" "texture"; + setAttr ".maskChannel_06" -type "float3" 0 0 0 ; + setAttr ".maskWeight_01_Name" -type "string" "maskWeight_01"; + setAttr ".maskWeight_01_Type" -type "string" "float"; + setAttr -k on ".maskWeight_01" 0; + setAttr ".maskChannel_07_Name" -type "string" "maskChannel_07"; + setAttr ".maskChannel_07_Type" -type "string" "texture"; + setAttr ".maskChannel_07" -type "float3" 0 0 0 ; + setAttr ".maskWeight_02_Name" -type "string" "maskWeight_02"; + setAttr ".maskWeight_02_Type" -type "string" "float"; + setAttr -k on ".maskWeight_02" 0; + setAttr ".maskChannel_08_Name" -type "string" "maskChannel_08"; + setAttr ".maskChannel_08_Type" -type "string" "texture"; + setAttr ".maskChannel_08" -type "float3" 0 0 0 ; + setAttr ".maskChannel_09_Name" -type "string" "maskChannel_09"; + setAttr ".maskChannel_09_Type" -type "string" "texture"; + setAttr ".maskChannel_09" -type "float3" 0 0 0 ; + setAttr ".maskWeight_03_Name" -type "string" "maskWeight_03"; + setAttr ".maskWeight_03_Type" -type "string" "float"; + setAttr -k on ".maskWeight_03" 0; + setAttr ".maskChannel_10_Name" -type "string" "maskChannel_10"; + setAttr ".maskChannel_10_Type" -type "string" "texture"; + setAttr ".maskChannel_10" -type "float3" 0 0 0 ; + setAttr ".maskWeight_04_Name" -type "string" "maskWeight_04"; + setAttr ".maskWeight_04_Type" -type "string" "float"; + setAttr -k on ".maskWeight_04" 0; + setAttr ".maskWeight_05_Name" -type "string" "maskWeight_05"; + setAttr ".maskWeight_05_Type" -type "string" "float"; + setAttr -k on ".maskWeight_05" 0; + setAttr ".maskChannel_11_Name" -type "string" "maskChannel_11"; + setAttr ".maskChannel_11_Type" -type "string" "texture"; + setAttr ".maskChannel_11" -type "float3" 0 0 0 ; + setAttr ".maskWeight_06_Name" -type "string" "maskWeight_06"; + setAttr ".maskWeight_06_Type" -type "string" "float"; + setAttr -k on ".maskWeight_06" 0; + setAttr ".maskChannel_12_Name" -type "string" "maskChannel_12"; + setAttr ".maskChannel_12_Type" -type "string" "texture"; + setAttr ".maskChannel_12" -type "float3" 0 0 0 ; + setAttr ".maskChannel_13_Name" -type "string" "maskChannel_13"; + setAttr ".maskChannel_13_Type" -type "string" "texture"; + setAttr ".maskChannel_13" -type "float3" 0 0 0 ; + setAttr ".maskWeight_07_Name" -type "string" "maskWeight_07"; + setAttr ".maskWeight_07_Type" -type "string" "float"; + setAttr -k on ".maskWeight_07" 0; + setAttr ".maskWeight_08_Name" -type "string" "maskWeight_08"; + setAttr ".maskWeight_08_Type" -type "string" "float"; + setAttr -k on ".maskWeight_08" 0; + setAttr ".maskChannel_14_Name" -type "string" "maskChannel_14"; + setAttr ".maskChannel_14_Type" -type "string" "texture"; + setAttr ".maskChannel_14" -type "float3" 0 0 0 ; + setAttr ".maskChannel_15_Name" -type "string" "maskChannel_15"; + setAttr ".maskChannel_15_Type" -type "string" "texture"; + setAttr ".maskChannel_15" -type "float3" 0 0 0 ; + setAttr ".maskWeight_09_Name" -type "string" "maskWeight_09"; + setAttr ".maskWeight_09_Type" -type "string" "float"; + setAttr -k on ".maskWeight_09" 0; + setAttr ".maskChannel_16_Name" -type "string" "maskChannel_16"; + setAttr ".maskChannel_16_Type" -type "string" "texture"; + setAttr ".maskChannel_16" -type "float3" 0 0 0 ; + setAttr ".maskWeight_10_Name" -type "string" "maskWeight_10"; + setAttr ".maskWeight_10_Type" -type "string" "float"; + setAttr -k on ".maskWeight_10" 0; + setAttr ".maskChannel_17_Name" -type "string" "maskChannel_17"; + setAttr ".maskChannel_17_Type" -type "string" "texture"; + setAttr ".maskChannel_17" -type "float3" 0 0 0 ; + setAttr ".maskWeight_11_Name" -type "string" "maskWeight_11"; + setAttr ".maskWeight_11_Type" -type "string" "float"; + setAttr -k on ".maskWeight_11" 0; + setAttr ".maskWeight_12_Name" -type "string" "maskWeight_12"; + setAttr ".maskWeight_12_Type" -type "string" "float"; + setAttr -k on ".maskWeight_12" 0; + setAttr ".maskChannel_18_Name" -type "string" "maskChannel_18"; + setAttr ".maskChannel_18_Type" -type "string" "texture"; + setAttr ".maskChannel_18" -type "float3" 0 0 0 ; + setAttr ".maskWeight_13_Name" -type "string" "maskWeight_13"; + setAttr ".maskWeight_13_Type" -type "string" "float"; + setAttr -k on ".maskWeight_13" 0; + setAttr ".maskChannel_19_Name" -type "string" "maskChannel_19"; + setAttr ".maskChannel_19_Type" -type "string" "texture"; + setAttr ".maskChannel_19" -type "float3" 0 0 0 ; + setAttr ".maskWeight_14_Name" -type "string" "maskWeight_14"; + setAttr ".maskWeight_14_Type" -type "string" "float"; + setAttr -k on ".maskWeight_14" 0; + setAttr ".maskChannel_20_Name" -type "string" "maskChannel_20"; + setAttr ".maskChannel_20_Type" -type "string" "texture"; + setAttr ".maskChannel_20" -type "float3" 0 0 0 ; + setAttr ".maskWeight_15_Name" -type "string" "maskWeight_15"; + setAttr ".maskWeight_15_Type" -type "string" "float"; + setAttr -k on ".maskWeight_15" 0; + setAttr ".maskChannel_21_Name" -type "string" "maskChannel_21"; + setAttr ".maskChannel_21_Type" -type "string" "texture"; + setAttr ".maskChannel_21" -type "float3" 0 0 0 ; + setAttr ".maskWeight_16_Name" -type "string" "maskWeight_16"; + setAttr ".maskWeight_16_Type" -type "string" "float"; + setAttr -k on ".maskWeight_16" 0; + setAttr ".maskChannel_22_Name" -type "string" "maskChannel_22"; + setAttr ".maskChannel_22_Type" -type "string" "texture"; + setAttr ".maskChannel_22" -type "float3" 0 0 0 ; + setAttr ".maskWeight_17_Name" -type "string" "maskWeight_17"; + setAttr ".maskWeight_17_Type" -type "string" "float"; + setAttr -k on ".maskWeight_17" 0; + setAttr ".maskChannel_23_Name" -type "string" "maskChannel_23"; + setAttr ".maskChannel_23_Type" -type "string" "texture"; + setAttr ".maskChannel_23" -type "float3" 0 0 0 ; + setAttr ".maskWeight_18_Name" -type "string" "maskWeight_18"; + setAttr ".maskWeight_18_Type" -type "string" "float"; + setAttr -k on ".maskWeight_18" 0; + setAttr ".maskChannel_24_Name" -type "string" "maskChannel_24"; + setAttr ".maskChannel_24_Type" -type "string" "texture"; + setAttr ".maskChannel_24" -type "float3" 0 0 0 ; + setAttr ".maskChannel_25_Name" -type "string" "maskChannel_25"; + setAttr ".maskChannel_25_Type" -type "string" "texture"; + setAttr ".maskChannel_25" -type "float3" 0 0 0 ; + setAttr ".maskWeight_19_Name" -type "string" "maskWeight_19"; + setAttr ".maskWeight_19_Type" -type "string" "float"; + setAttr -k on ".maskWeight_19" 0; + setAttr ".maskWeight_20_Name" -type "string" "maskWeight_20"; + setAttr ".maskWeight_20_Type" -type "string" "float"; + setAttr -k on ".maskWeight_20" 0; + setAttr ".maskChannel_26_Name" -type "string" "maskChannel_26"; + setAttr ".maskChannel_26_Type" -type "string" "texture"; + setAttr ".maskChannel_26" -type "float3" 0 0 0 ; + setAttr ".maskWeight_21_Name" -type "string" "maskWeight_21"; + setAttr ".maskWeight_21_Type" -type "string" "float"; + setAttr -k on ".maskWeight_21" 0; + setAttr ".maskChannel_27_Name" -type "string" "maskChannel_27"; + setAttr ".maskChannel_27_Type" -type "string" "texture"; + setAttr ".maskChannel_27" -type "float3" 0 0 0 ; + setAttr ".maskWeight_22_Name" -type "string" "maskWeight_22"; + setAttr ".maskWeight_22_Type" -type "string" "float"; + setAttr -k on ".maskWeight_22" 0; + setAttr ".maskChannel_28_Name" -type "string" "maskChannel_28"; + setAttr ".maskChannel_28_Type" -type "string" "texture"; + setAttr ".maskChannel_28" -type "float3" 0 0 0 ; + setAttr ".maskWeight_23_Name" -type "string" "maskWeight_23"; + setAttr ".maskWeight_23_Type" -type "string" "float"; + setAttr -k on ".maskWeight_23" 0; + setAttr ".maskChannel_29_Name" -type "string" "maskChannel_29"; + setAttr ".maskChannel_29_Type" -type "string" "texture"; + setAttr ".maskChannel_29" -type "float3" 0 0 0 ; + setAttr ".maskChannel_30_Name" -type "string" "maskChannel_30"; + setAttr ".maskChannel_30_Type" -type "string" "texture"; + setAttr ".maskChannel_30" -type "float3" 0 0 0 ; + setAttr ".maskWeight_24_Name" -type "string" "maskWeight_24"; + setAttr ".maskWeight_24_Type" -type "string" "float"; + setAttr -k on ".maskWeight_24" 0; + setAttr ".maskWeight_25_Name" -type "string" "maskWeight_25"; + setAttr ".maskWeight_25_Type" -type "string" "float"; + setAttr -k on ".maskWeight_25" 0; + setAttr ".maskChannel_31_Name" -type "string" "maskChannel_31"; + setAttr ".maskChannel_31_Type" -type "string" "texture"; + setAttr ".maskChannel_31" -type "float3" 0 0 0 ; + setAttr ".maskWeight_26_Name" -type "string" "maskWeight_26"; + setAttr ".maskWeight_26_Type" -type "string" "float"; + setAttr -k on ".maskWeight_26" 0; + setAttr ".maskChannel_32_Name" -type "string" "maskChannel_32"; + setAttr ".maskChannel_32_Type" -type "string" "texture"; + setAttr ".maskChannel_32" -type "float3" 0 0 0 ; + setAttr ".maskWeight_27_Name" -type "string" "maskWeight_27"; + setAttr ".maskWeight_27_Type" -type "string" "float"; + setAttr -k on ".maskWeight_27" 0; + setAttr ".maskChannel_33_Name" -type "string" "maskChannel_33"; + setAttr ".maskChannel_33_Type" -type "string" "texture"; + setAttr ".maskChannel_33" -type "float3" 0 0 0 ; + setAttr ".maskWeight_28_Name" -type "string" "maskWeight_28"; + setAttr ".maskWeight_28_Type" -type "string" "float"; + setAttr -k on ".maskWeight_28" 0; + setAttr ".maskChannel_34_Name" -type "string" "maskChannel_34"; + setAttr ".maskChannel_34_Type" -type "string" "texture"; + setAttr ".maskChannel_34" -type "float3" 0 0 0 ; + setAttr ".maskWeight_29_Name" -type "string" "maskWeight_29"; + setAttr ".maskWeight_29_Type" -type "string" "float"; + setAttr -k on ".maskWeight_29" 0; + setAttr ".maskChannel_35_Name" -type "string" "maskChannel_35"; + setAttr ".maskChannel_35_Type" -type "string" "texture"; + setAttr ".maskChannel_35" -type "float3" 0 0 0 ; + setAttr ".maskWeight_30_Name" -type "string" "maskWeight_30"; + setAttr ".maskWeight_30_Type" -type "string" "float"; + setAttr -k on ".maskWeight_30" 0; + setAttr ".maskChannel_36_Name" -type "string" "maskChannel_36"; + setAttr ".maskChannel_36_Type" -type "string" "texture"; + setAttr ".maskChannel_36" -type "float3" 0 0 0 ; + setAttr ".maskWeight_31_Name" -type "string" "maskWeight_31"; + setAttr ".maskWeight_31_Type" -type "string" "float"; + setAttr -k on ".maskWeight_31" 0; + setAttr ".maskWeight_32_Name" -type "string" "maskWeight_32"; + setAttr ".maskWeight_32_Type" -type "string" "float"; + setAttr -k on ".maskWeight_32" 0; + setAttr ".maskWeight_33_Name" -type "string" "maskWeight_33"; + setAttr ".maskWeight_33_Type" -type "string" "float"; + setAttr -k on ".maskWeight_33" 0; + setAttr ".maskWeight_34_Name" -type "string" "maskWeight_34"; + setAttr ".maskWeight_34_Type" -type "string" "float"; + setAttr -k on ".maskWeight_34" 0; + setAttr ".maskWeight_35_Name" -type "string" "maskWeight_35"; + setAttr ".maskWeight_35_Type" -type "string" "float"; + setAttr -k on ".maskWeight_35" 0; + setAttr ".maskWeight_36_Name" -type "string" "maskWeight_36"; + setAttr ".maskWeight_36_Type" -type "string" "float"; + setAttr -k on ".maskWeight_36" 0; + setAttr ".maskWeight_37_Name" -type "string" "maskWeight_37"; + setAttr ".maskWeight_37_Type" -type "string" "float"; + setAttr -k on ".maskWeight_37" 0; + setAttr ".maskWeight_38_Name" -type "string" "maskWeight_38"; + setAttr ".maskWeight_38_Type" -type "string" "float"; + setAttr -k on ".maskWeight_38" 0; + setAttr ".maskWeight_39_Name" -type "string" "maskWeight_39"; + setAttr ".maskWeight_39_Type" -type "string" "float"; + setAttr -k on ".maskWeight_39" 0; + setAttr ".maskWeight_40_Name" -type "string" "maskWeight_40"; + setAttr ".maskWeight_40_Type" -type "string" "float"; + setAttr -k on ".maskWeight_40" 0; + setAttr ".maskWeight_41_Name" -type "string" "maskWeight_41"; + setAttr ".maskWeight_41_Type" -type "string" "float"; + setAttr -k on ".maskWeight_41" 0; + setAttr ".maskWeight_42_Name" -type "string" "maskWeight_42"; + setAttr ".maskWeight_42_Type" -type "string" "float"; + setAttr -k on ".maskWeight_42" 0; + setAttr ".maskWeight_43_Name" -type "string" "maskWeight_43"; + setAttr ".maskWeight_43_Type" -type "string" "float"; + setAttr -k on ".maskWeight_43" 0; + setAttr ".maskWeight_44_Name" -type "string" "maskWeight_44"; + setAttr ".maskWeight_44_Type" -type "string" "float"; + setAttr -k on ".maskWeight_44" 0; + setAttr ".maskWeight_45_Name" -type "string" "maskWeight_45"; + setAttr ".maskWeight_45_Type" -type "string" "float"; + setAttr -k on ".maskWeight_45" 0; + setAttr ".maskWeight_46_Name" -type "string" "maskWeight_46"; + setAttr ".maskWeight_46_Type" -type "string" "float"; + setAttr -k on ".maskWeight_46" 0; + setAttr ".maskWeight_47_Name" -type "string" "maskWeight_47"; + setAttr ".maskWeight_47_Type" -type "string" "float"; + setAttr -k on ".maskWeight_47" 0; + setAttr ".maskWeight_48_Name" -type "string" "maskWeight_48"; + setAttr ".maskWeight_48_Type" -type "string" "float"; + setAttr -k on ".maskWeight_48" 0; + setAttr ".maskWeight_49_Name" -type "string" "maskWeight_49"; + setAttr ".maskWeight_49_Type" -type "string" "float"; + setAttr -k on ".maskWeight_49" 0; + setAttr ".maskWeight_50_Name" -type "string" "maskWeight_50"; + setAttr ".maskWeight_50_Type" -type "string" "float"; + setAttr -k on ".maskWeight_50" 0; + setAttr ".maskWeight_51_Name" -type "string" "maskWeight_51"; + setAttr ".maskWeight_51_Type" -type "string" "float"; + setAttr -k on ".maskWeight_51" 0; + setAttr ".maskWeight_52_Name" -type "string" "maskWeight_52"; + setAttr ".maskWeight_52_Type" -type "string" "float"; + setAttr -k on ".maskWeight_52" 0; + setAttr ".maskWeight_53_Name" -type "string" "maskWeight_53"; + setAttr ".maskWeight_53_Type" -type "string" "float"; + setAttr -k on ".maskWeight_53" 0; + setAttr ".maskWeight_54_Name" -type "string" "maskWeight_54"; + setAttr ".maskWeight_54_Type" -type "string" "float"; + setAttr -k on ".maskWeight_54" 0; + setAttr ".maskWeight_55_Name" -type "string" "maskWeight_55"; + setAttr ".maskWeight_55_Type" -type "string" "float"; + setAttr -k on ".maskWeight_55" 0; + setAttr ".maskWeight_56_Name" -type "string" "maskWeight_56"; + setAttr ".maskWeight_56_Type" -type "string" "float"; + setAttr -k on ".maskWeight_56" 0; + setAttr ".maskWeight_57_Name" -type "string" "maskWeight_57"; + setAttr ".maskWeight_57_Type" -type "string" "float"; + setAttr -k on ".maskWeight_57" 0; + setAttr ".maskWeight_58_Name" -type "string" "maskWeight_58"; + setAttr ".maskWeight_58_Type" -type "string" "float"; + setAttr -k on ".maskWeight_58" 0; + setAttr ".maskWeight_59_Name" -type "string" "maskWeight_59"; + setAttr ".maskWeight_59_Type" -type "string" "float"; + setAttr -k on ".maskWeight_59" 0; + setAttr ".maskWeight_60_Name" -type "string" "maskWeight_60"; + setAttr ".maskWeight_60_Type" -type "string" "float"; + setAttr -k on ".maskWeight_60" 0; + setAttr ".maskWeight_61_Name" -type "string" "maskWeight_61"; + setAttr ".maskWeight_61_Type" -type "string" "float"; + setAttr -k on ".maskWeight_61" 0; + setAttr ".maskWeight_62_Name" -type "string" "maskWeight_62"; + setAttr ".maskWeight_62_Type" -type "string" "float"; + setAttr -k on ".maskWeight_62" 0; + setAttr ".maskWeight_63_Name" -type "string" "maskWeight_63"; + setAttr ".maskWeight_63_Type" -type "string" "float"; + setAttr -k on ".maskWeight_63" 0; + setAttr ".maskWeight_64_Name" -type "string" "maskWeight_64"; + setAttr ".maskWeight_64_Type" -type "string" "float"; + setAttr -k on ".maskWeight_64" 0; + setAttr ".maskWeight_65_Name" -type "string" "maskWeight_65"; + setAttr ".maskWeight_65_Type" -type "string" "float"; + setAttr -k on ".maskWeight_65" 0; + setAttr ".maskWeight_66_Name" -type "string" "maskWeight_66"; + setAttr ".maskWeight_66_Type" -type "string" "float"; + setAttr -k on ".maskWeight_66" 0; + setAttr ".maskWeight_67_Name" -type "string" "maskWeight_67"; + setAttr ".maskWeight_67_Type" -type "string" "float"; + setAttr -k on ".maskWeight_67" 0; + setAttr ".maskWeight_68_Name" -type "string" "maskWeight_68"; + setAttr ".maskWeight_68_Type" -type "string" "float"; + setAttr -k on ".maskWeight_68" 0; + setAttr ".maskWeight_69_Name" -type "string" "maskWeight_69"; + setAttr ".maskWeight_69_Type" -type "string" "float"; + setAttr -k on ".maskWeight_69" 0; + setAttr ".maskWeight_70_Name" -type "string" "maskWeight_70"; + setAttr ".maskWeight_70_Type" -type "string" "float"; + setAttr -k on ".maskWeight_70" 0; + setAttr ".maskWeight_71_Name" -type "string" "maskWeight_71"; + setAttr ".maskWeight_71_Type" -type "string" "float"; + setAttr -k on ".maskWeight_71" 0; + setAttr ".maskWeight_72_Name" -type "string" "maskWeight_72"; + setAttr ".maskWeight_72_Type" -type "string" "float"; + setAttr -k on ".maskWeight_72" 0; + setAttr ".maskWeight_73_Name" -type "string" "maskWeight_73"; + setAttr ".maskWeight_73_Type" -type "string" "float"; + setAttr -k on ".maskWeight_73" 0; + setAttr ".maskWeight_74_Name" -type "string" "maskWeight_74"; + setAttr ".maskWeight_74_Type" -type "string" "float"; + setAttr -k on ".maskWeight_74" 0; + setAttr ".maskWeight_75_Name" -type "string" "maskWeight_75"; + setAttr ".maskWeight_75_Type" -type "string" "float"; + setAttr -k on ".maskWeight_75" 0; + setAttr ".maskWeight_76_Name" -type "string" "maskWeight_76"; + setAttr ".maskWeight_76_Type" -type "string" "float"; + setAttr -k on ".maskWeight_76" 0; + setAttr ".maskWeight_77_Name" -type "string" "maskWeight_77"; + setAttr ".maskWeight_77_Type" -type "string" "float"; + setAttr -k on ".maskWeight_77" 0; + setAttr ".maskWeight_78_Name" -type "string" "maskWeight_78"; + setAttr ".maskWeight_78_Type" -type "string" "float"; + setAttr -k on ".maskWeight_78" 0; + setAttr ".maskWeight_79_Name" -type "string" "maskWeight_79"; + setAttr ".maskWeight_79_Type" -type "string" "float"; + setAttr -k on ".maskWeight_79" 0; + setAttr ".maskWeight_80_Name" -type "string" "maskWeight_80"; + setAttr ".maskWeight_80_Type" -type "string" "float"; + setAttr -k on ".maskWeight_80" 0; + setAttr ".maskWeight_81_Name" -type "string" "maskWeight_81"; + setAttr ".maskWeight_81_Type" -type "string" "float"; + setAttr -k on ".maskWeight_81" 0; +createNode shadingEngine -n "shader_head_shaderSG"; + rename -uid "7EF66A4A-4CF9-19EF-2CAE-43A66BD86450"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo1"; + rename -uid "666E56BA-4056-42F6-D724-6A82CF0141C9"; +createNode dx11Shader -n "shader_teeth_shader"; + rename -uid "F3B6C2CC-43E7-F0F0-F0FB-DBA8CFF7413C"; + addAttr -s false -is true -ci true -k true -sn "te" -ln "techniqueEnum" -nn "Technique" + -ct "HW_shader_parameter" -min 0 -max 2 -en "TessellationOFF" -at "enum"; + addAttr -ci true -sn "Light_0_use_implicit_lighting" -ln "Light_0_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_0_connected_light" -ln "Light_0_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_1_use_implicit_lighting" -ln "Light_1_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_1_connected_light" -ln "Light_1_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_2_use_implicit_lighting" -ln "Light_2_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_2_connected_light" -ln "Light_2_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Name" -ln "SuperFilterTaps_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Type" -ln "SuperFilterTaps_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps" -ln "SuperFilterTaps" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "SuperFilterTapsX" -ln "SuperFilterTapsX" -ct "HW_shader_parameter" + -dv -0.84052002429962158 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -sn "SuperFilterTapsY" -ln "SuperFilterTapsY" -ct "HW_shader_parameter" + -dv -0.073954001069068909 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Name" -ln "shadowMapTexelSize_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Type" -ln "shadowMapTexelSize_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize" -ln "shadowMapTexelSize" + -ct "HW_shader_parameter" -dv 0.0019531298894435167 -smn 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Name" -ln "LinearSpaceLighting_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Type" -ln "LinearSpaceLighting_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "LinearSpaceLighting" -ln "LinearSpaceLighting" + -nn "Linear Space Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseShadows_Name" -ln "UseShadows_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "UseShadows_Type" -ln "UseShadows_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "UseShadows" -ln "UseShadows" -nn "Shadows" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Name" -ln "shadowMultiplier_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Type" -ln "shadowMultiplier_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowMultiplier" -ln "shadowMultiplier" + -nn "Shadow Strength" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Name" -ln "IsSwatchRender_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Type" -ln "IsSwatchRender_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender" -ln "IsSwatchRender" -ct "HW_shader_parameter" + -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Name" -ln "shadowDepthBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Type" -ln "shadowDepthBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDepthBias" -ln "shadowDepthBias" -nn "Shadow Bias" + -ct "HW_shader_parameter" -dv 0.0099999997764825821 -min 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Name" -ln "MayaFullScreenGamma_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Type" -ln "MayaFullScreenGamma_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma" -ln "MayaFullScreenGamma" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Name" -ln "flipBackfaceNormals_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Type" -ln "flipBackfaceNormals_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "flipBackfaceNormals" -ln "flipBackfaceNormals" + -nn "Double Sided Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Enable_Name" -ln "light0Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Enable_Type" -ln "light0Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Enable" -ln "light0Enable" -nn "Enable Light 0" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Type_Name" -ln "light0Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Type_Type" -ln "light0Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Type" -ln "light0Type" -nn "Light 0 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light0Pos_Name" -ln "light0Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Pos_Type" -ln "light0Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Pos" -ln "light0Pos" -nn "Light 0 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0Color_Name" -ln "light0Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Color_Type" -ln "light0Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light0Color" -ln "light0Color" -nn "Light 0 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ColorR" -ln "light0ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorG" -ln "light0ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorB" -ln "light0ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -h true -sn "light0Intensity_Name" -ln "light0Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Intensity_Type" -ln "light0Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Intensity" -ln "light0Intensity" -nn "Light 0 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0Dir_Name" -ln "light0Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Dir_Type" -ln "light0Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Dir" -ln "light0Dir" -nn "Light 0 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Name" -ln "light0ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Type" -ln "light0ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0ConeAngle" -ln "light0ConeAngle" -nn "Light 0 Cone Angle" + -ct "HW_shader_parameter" -dv 0.46000000834465027 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0FallOff_Name" -ln "light0FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0FallOff_Type" -ln "light0FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0FallOff" -ln "light0FallOff" -nn "Light 0 Penumbra Angle" + -ct "HW_shader_parameter" -dv 0.69999998807907104 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Name" -ln "light0AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Type" -ln "light0AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0AttenScale" -ln "light0AttenScale" + -nn "Light 0 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Name" -ln "light0ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Type" -ln "light0ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn" -ln "light0ShadowOn" -nn "Light 0 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Enable_Name" -ln "light1Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Enable_Type" -ln "light1Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Enable" -ln "light1Enable" -nn "Enable Light 1" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Type_Name" -ln "light1Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Type_Type" -ln "light1Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Type" -ln "light1Type" -nn "Light 1 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light1Pos_Name" -ln "light1Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Pos_Type" -ln "light1Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Pos" -ln "light1Pos" -nn "Light 1 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1Color_Name" -ln "light1Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Color_Type" -ln "light1Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light1Color" -ln "light1Color" -nn "Light 1 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ColorR" -ln "light1ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorG" -ln "light1ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorB" -ln "light1ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -h true -sn "light1Intensity_Name" -ln "light1Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Intensity_Type" -ln "light1Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Intensity" -ln "light1Intensity" -nn "Light 1 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1Dir_Name" -ln "light1Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Dir_Type" -ln "light1Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Dir" -ln "light1Dir" -nn "Light 1 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Name" -ln "light1ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Type" -ln "light1ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1ConeAngle" -ln "light1ConeAngle" -nn "Light 1 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1FallOff_Name" -ln "light1FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1FallOff_Type" -ln "light1FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1FallOff" -ln "light1FallOff" -nn "Light 1 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Name" -ln "light1AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Type" -ln "light1AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1AttenScale" -ln "light1AttenScale" + -nn "Light 1 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Name" -ln "light1ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Type" -ln "light1ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn" -ln "light1ShadowOn" -nn "Light 1 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Enable_Name" -ln "light2Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Enable_Type" -ln "light2Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Enable" -ln "light2Enable" -nn "Enable Light 2" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Type_Name" -ln "light2Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Type_Type" -ln "light2Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Type" -ln "light2Type" -nn "Light 2 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light2Pos_Name" -ln "light2Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Pos_Type" -ln "light2Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Pos" -ln "light2Pos" -nn "Light 2 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2Color_Name" -ln "light2Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Color_Type" -ln "light2Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light2Color" -ln "light2Color" -nn "Light 2 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ColorR" -ln "light2ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorG" -ln "light2ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorB" -ln "light2ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -h true -sn "light2Intensity_Name" -ln "light2Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Intensity_Type" -ln "light2Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Intensity" -ln "light2Intensity" -nn "Light 2 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2Dir_Name" -ln "light2Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Dir_Type" -ln "light2Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Dir" -ln "light2Dir" -nn "Light 2 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Name" -ln "light2ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Type" -ln "light2ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2ConeAngle" -ln "light2ConeAngle" -nn "Light 2 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2FallOff_Name" -ln "light2FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2FallOff_Type" -ln "light2FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2FallOff" -ln "light2FallOff" -nn "Light 2 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Name" -ln "light2AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Type" -ln "light2AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2AttenScale" -ln "light2AttenScale" + -nn "Light 2 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Name" -ln "light2ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Type" -ln "light2ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn" -ln "light2ShadowOn" -nn "Light 2 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Name" -ln "UseAmbientOcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Type" -ln "UseAmbientOcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseAmbientOcclusionTexture" -ln "UseAmbientOcclusionTexture" + -nn "Use Occlusion Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Name" -ln "transpDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Type" -ln "transpDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "transpDepthTexture" -ln "transpDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "transpDepthTextureR" -ln "transpDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureG" -ln "transpDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureB" -ln "transpDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Name" -ln "opaqueDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Type" -ln "opaqueDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "opaqueDepthTexture" -ln "opaqueDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "opaqueDepthTextureR" -ln "opaqueDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureG" -ln "opaqueDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureB" -ln "opaqueDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Name" -ln "UseDiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Type" -ln "UseDiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTexture" -ln "UseDiffuseTexture" + -nn "Use Diffuse Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Name" -ln "UseDiffuseTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Type" -ln "UseDiffuseTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTextureAlpha" -ln "UseDiffuseTextureAlpha" + -nn "Use Diffuse Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Name" -ln "DiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Type" -ln "DiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseTexture" -ln "DiffuseTexture" -nn "Diffuse Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseTextureR" -ln "DiffuseTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureG" -ln "DiffuseTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureB" -ln "DiffuseTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Name" -ln "DiffuseColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Type" -ln "DiffuseColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "DiffuseColor" -ln "DiffuseColor" -nn "Diffuse Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseColorR" -ln "DiffuseColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorG" -ln "DiffuseColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorB" -ln "DiffuseColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -h true -sn "Opacity_Name" -ln "Opacity_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Opacity_Type" -ln "Opacity_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Opacity" -ln "Opacity" -nn "Opacity" -ct "HW_shader_parameter" + -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Name" -ln "UseOpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Type" -ln "UseOpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseOpacityMaskTexture" -ln "UseOpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Name" -ln "OpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Type" -ln "OpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OpacityMaskTexture" -ln "OpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OpacityMaskTextureR" -ln "OpacityMaskTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureG" -ln "OpacityMaskTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureB" -ln "OpacityMaskTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Name" -ln "OpacityMaskBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Type" -ln "OpacityMaskBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskBias" -ln "OpacityMaskBias" -nn "Opacity Mask Bias" + -ct "HW_shader_parameter" -dv 0.10000000149011612 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Name" -ln "UseSpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Type" -ln "UseSpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTexture" -ln "UseSpecularTexture" + -nn "Use Specular Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Name" -ln "SpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Type" -ln "SpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularTexture" -ln "SpecularTexture" -nn "Specular Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularTextureR" -ln "SpecularTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureG" -ln "SpecularTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureB" -ln "SpecularTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -h true -sn "SpecularColor_Name" -ln "SpecularColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularColor_Type" -ln "SpecularColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "SpecularColor" -ln "SpecularColor" -nn "Specular Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularColorR" -ln "SpecularColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorG" -ln "SpecularColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorB" -ln "SpecularColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Name" -ln "UseNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Type" -ln "UseNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseNormalTexture" -ln "UseNormalTexture" + -nn "Use Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalTexture_Name" -ln "NormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexture_Type" -ln "NormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "NormalTexture" -ln "NormalTexture" -nn "Normal Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "NormalTextureR" -ln "NormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureG" -ln "NormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureB" -ln "NormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -h true -sn "NormalHeight_Name" -ln "NormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalHeight_Type" -ln "NormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalHeight" -ln "NormalHeight" -nn "Normal Height" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx 5 -at "float"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Name" -ln "SupportNonUniformScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Type" -ln "SupportNonUniformScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SupportNonUniformScale" -ln "SupportNonUniformScale" + -nn "Support Non-Uniform Scale" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Name" -ln "NormalCoordsysX_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Type" -ln "NormalCoordsysX_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysX" -ln "NormalCoordsysX" -nn "Normal X (Red)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Name" -ln "NormalCoordsysY_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Type" -ln "NormalCoordsysY_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysY" -ln "NormalCoordsysY" -nn "Normal Y (Green)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Name" -ln "DisplacementModel_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Type" -ln "DisplacementModel_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementModel" -ln "DisplacementModel" + -nn "Displacement Model" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en + "Grayscale:Tangent Vector" -at "enum"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Name" -ln "UseDisplacementMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Type" -ln "UseDisplacementMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDisplacementMap" -ln "UseDisplacementMap" + -nn "Displacement Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Name" -ln "DisplacementTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Type" -ln "DisplacementTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DisplacementTexture" -ln "DisplacementTexture" + -nn "Displacement Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DisplacementTextureR" -ln "DisplacementTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureG" -ln "DisplacementTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureB" -ln "DisplacementTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Name" -ln "VectorDisplacementCoordSys_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Type" -ln "VectorDisplacementCoordSys_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "VectorDisplacementCoordSys" -ln "VectorDisplacementCoordSys" + -nn "Displacement Coordsys" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 + -en "Mudbox (XZY):Maya (XYZ)" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Name" -ln "DisplacementHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Type" -ln "DisplacementHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementHeight" -ln "DisplacementHeight" + -nn "Displacement Height" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Name" -ln "DisplacementOffset_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Type" -ln "DisplacementOffset_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementOffset" -ln "DisplacementOffset" + -nn "Displacement Offset" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn -1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Name" -ln "DisplacementClippingBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Type" -ln "DisplacementClippingBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementClippingBias" -ln "DisplacementClippingBias" + -nn "Displacement Clipping Bias" -ct "HW_shader_parameter" -dv 5 -min -99999 -max + 99999 -smn 0 -smx 99 -at "float"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Name" -ln "BBoxExtraScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Type" -ln "BBoxExtraScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "BBoxExtraScale" -ln "BBoxExtraScale" -nn "Bounding Box Extra Scale" + -ct "HW_shader_parameter" -dv 1 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationRange_Name" -ln "TessellationRange_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationRange_Type" -ln "TessellationRange_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationRange" -ln "TessellationRange" + -nn "Tessellation Range" -ct "HW_shader_parameter" -min 0 -max 99999 -smx 999 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationMin_Name" -ln "TessellationMin_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationMin_Type" -ln "TessellationMin_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationMin" -ln "TessellationMin" -nn "Tessellation Minimum" + -ct "HW_shader_parameter" -dv 3 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Name" -ln "FlatTessellation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Type" -ln "FlatTessellation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "FlatTessellation" -ln "FlatTessellation" + -nn "Flat Tessellation" -ct "HW_shader_parameter" -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Name" -ln "UseTranslucency_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Type" -ln "UseTranslucency_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseTranslucency" -ln "UseTranslucency" -nn "Back Scattering" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Name" -ln "UseThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Type" -ln "UseThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseThicknessTexture" -ln "UseThicknessTexture" + -nn "Use Thickness Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Name" -ln "UseDiffuseIBLMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Type" -ln "UseDiffuseIBLMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseIBLMap" -ln "UseDiffuseIBLMap" + -nn "Use Diffuse Cubemap" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Name" -ln "DiffuseIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Type" -ln "DiffuseIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseIBLIntensity" -ln "DiffuseIBLIntensity" + -nn "Diffuse IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Name" -ln "DiffuseTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Type" -ln "DiffuseTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseTexcoord" -ln "DiffuseTexcoord" -nn "Diffuse Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Name" -ln "OpacityMaskTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Type" -ln "OpacityMaskTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskTexcoord" -ln "OpacityMaskTexcoord" + -nn "Opacity Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Name" -ln "SpecularTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Type" -ln "SpecularTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularTexcoord" -ln "SpecularTexcoord" + -nn "Specular Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Name" -ln "NormalTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Type" -ln "NormalTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalTexcoord" -ln "NormalTexcoord" -nn "Normal Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Name" -ln "DisplacementTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Type" -ln "DisplacementTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementTexcoord" -ln "DisplacementTexcoord" + -nn "Displacement Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en + "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Name" -ln "ThicknessTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Type" -ln "ThicknessTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "ThicknessTexcoord" -ln "ThicknessTexcoord" + -nn "Translucency Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 + -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Name" -ln "light0ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Type" -ln "light0ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light0ShadowMap" -ln "light0ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ShadowMapR" -ln "light0ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapG" -ln "light0ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapB" -ln "light0ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Name" -ln "light1ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Type" -ln "light1ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light1ShadowMap" -ln "light1ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ShadowMapR" -ln "light1ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapG" -ln "light1ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapB" -ln "light1ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Name" -ln "light2ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Type" -ln "light2ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light2ShadowMap" -ln "light2ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ShadowMapR" -ln "light2ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapG" -ln "light2ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapB" -ln "light2ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -h true -sn "screenSize_Name" -ln "screenSize_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize_Type" -ln "screenSize_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize" -ln "screenSize" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "screenSizeX" -ln "screenSizeX" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -sn "screenSizeY" -ln "screenSizeY" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -h true -sn "SkyRotation_Name" -ln "SkyRotation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SkyRotation_Type" -ln "SkyRotation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SkyRotation" -ln "SkyRotation" -nn "Sky Rotation" + -ct "HW_shader_parameter" -min 0 -max 99999 -smn 0 -smx 360 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Name" -ln "DiffuseCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Type" -ln "DiffuseCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseCubeIBL" -ln "DiffuseCubeIBL" -nn "Diffuse Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseCubeIBLR" -ln "DiffuseCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLG" -ln "DiffuseCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLB" -ln "DiffuseCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Name" -ln "UseSpecCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Type" -ln "UseSpecCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecCubeIBL" -ln "UseSpecCubeIBL" -nn "Use Specular Cubemap" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Name" -ln "SpecularIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Type" -ln "SpecularIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularIBLIntensity" -ln "SpecularIBLIntensity" + -nn "Specular IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Name" -ln "SpecularCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Type" -ln "SpecularCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularCubeIBL" -ln "SpecularCubeIBL" -nn "Specular Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularCubeIBLR" -ln "SpecularCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLG" -ln "SpecularCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLB" -ln "SpecularCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -h true -sn "LutTexture_Name" -ln "LutTexture_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LutTexture_Type" -ln "LutTexture_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -uac -sn "LutTexture" -ln "LutTexture" -nn "SSS LUT Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "LutTextureR" -ln "LutTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureG" -ln "LutTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureB" -ln "LutTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -h true -sn "DitherTexture_Name" -ln "DitherTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DitherTexture_Type" -ln "DitherTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DitherTexture" -ln "DitherTexture" -nn "SSS Dither Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DitherTextureR" -ln "DitherTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureG" -ln "DitherTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureB" -ln "DitherTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Name" -ln "skinCoeffX_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Type" -ln "skinCoeffX_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffX" -ln "skinCoeffX" -nn "SSS Coeffient R" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Name" -ln "skinCoeffY_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Type" -ln "skinCoeffY_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffY" -ln "skinCoeffY" -nn "SSS Coeffient G" + -ct "HW_shader_parameter" -dv 0.5 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Name" -ln "skinCoeffZ_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Type" -ln "skinCoeffZ_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffZ" -ln "skinCoeffZ" -nn "SSS Coeffient B" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Name" -ln "NormalBlurring_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Type" -ln "NormalBlurring_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalBlurring" -ln "NormalBlurring" -nn "SSS Softness" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Name" -ln "ScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Type" -ln "ScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "ScatteringRadiusTexture" -ln "ScatteringRadiusTexture" + -nn "SSS Radius Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "ScatteringRadiusTextureR" -ln "ScatteringRadiusTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureG" -ln "ScatteringRadiusTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureB" -ln "ScatteringRadiusTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Name" -ln "UseScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Type" -ln "UseScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseScatteringRadiusTexture" -ln "UseScatteringRadiusTexture" + -nn "Use SSS Radius Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "skinScattering_Name" -ln "skinScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScattering_Type" -ln "skinScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScattering" -ln "skinScattering" -nn "SSS Radius" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowBlur_Name" -ln "shadowBlur_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "shadowBlur_Type" -ln "shadowBlur_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "shadowBlur" -ln "shadowBlur" -nn "SSS Shadow Blur" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowDither_Name" -ln "shadowDither_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDither_Type" -ln "shadowDither_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDither" -ln "shadowDither" -nn "SSS Shadow Dither" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowScattering_Name" -ln "shadowScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowScattering_Type" -ln "shadowScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowScattering" -ln "shadowScattering" + -nn "SSS Shadow Scattering" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Name" -ln "shadowSaturation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Type" -ln "shadowSaturation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowSaturation" -ln "shadowSaturation" + -nn "SSS Shadow Saturation" -ct "HW_shader_parameter" -dv 1 -min 0 -max 4 -smx 4 + -at "float"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Name" -ln "BackScatteringThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Type" -ln "BackScatteringThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "BackScatteringThicknessTexture" -ln "BackScatteringThicknessTexture" + -nn "Thickness Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureR" -ln "BackScatteringThicknessTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureG" -ln "BackScatteringThicknessTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureB" -ln "BackScatteringThicknessTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Name" -ln "skinScatteringRoughness_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Type" -ln "skinScatteringRoughness_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringRoughness" -ln "skinScatteringRoughness" + -nn "Back Scattering Width" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Name" -ln "skinScatteringOuterColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Type" -ln "skinScatteringOuterColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "skinScatteringOuterColor" -ln "skinScatteringOuterColor" + -nn "Back Scattering Color" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "skinScatteringOuterColorR" -ln "skinScatteringOuterColorR" + -ct "HW_shader_parameter" -dv 0.25 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorG" -ln "skinScatteringOuterColorG" + -ct "HW_shader_parameter" -dv 0.05000000074505806 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorB" -ln "skinScatteringOuterColorB" + -ct "HW_shader_parameter" -dv 0.019999999552965164 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Name" -ln "skinScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Type" -ln "skinScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringAmount" -ln "skinScatteringAmount" + -nn "Back Scattering Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 6 -smx 6 + -at "float"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Name" -ln "skinAmbientScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Type" -ln "skinAmbientScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinAmbientScatteringAmount" -ln "skinAmbientScatteringAmount" + -nn "Back Scattering Ambient Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max + 6 -smx 6 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Name" -ln "UseSpecularTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Type" -ln "UseSpecularTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTextureAlpha" -ln "UseSpecularTextureAlpha" + -nn "Use Roughness Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "LobeMix_Name" -ln "LobeMix_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LobeMix_Type" -ln "LobeMix_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "LobeMix" -ln "LobeMix" -nn "Lobe Mixing" + -ct "HW_shader_parameter" -dv 0.75 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "Roughness_Name" -ln "Roughness_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Roughness_Type" -ln "Roughness_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Roughness" -ln "Roughness" -nn "Roughness multiplier" + -ct "HW_shader_parameter" -dv 0.20000000298023224 -min 0.0099999997764825821 -max + 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Name" -ln "OcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Type" -ln "OcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OcclusionTexture" -ln "OcclusionTexture" -nn "Ambient Occlusion Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OcclusionTextureR" -ln "OcclusionTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureG" -ln "OcclusionTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureB" -ln "OcclusionTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Name" -ln "OcclusionAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Type" -ln "OcclusionAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionAmount" -ln "OcclusionAmount" -nn "Occlusion Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Name" -ln "UseCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Type" -ln "UseCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseCavityTexture" -ln "UseCavityTexture" + -nn "Use Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "CavityTexture_Name" -ln "CavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityTexture_Type" -ln "CavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "CavityTexture" -ln "CavityTexture" -nn "Cavity Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "CavityTextureR" -ln "CavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureG" -ln "CavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureB" -ln "CavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -h true -sn "CavityAmount_Name" -ln "CavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityAmount_Type" -ln "CavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "CavityAmount" -ln "CavityAmount" -nn "Cavity Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Name" -ln "UseMicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Type" -ln "UseMicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroCavityTexture" -ln "UseMicroCavityTexture" + -nn "Use Micro Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Name" -ln "MicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Type" -ln "MicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroCavityTexture" -ln "MicroCavityTexture" + -nn "Micro Cavity Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroCavityTextureR" -ln "MicroCavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureG" -ln "MicroCavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureB" -ln "MicroCavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Name" -ln "MicroCavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Type" -ln "MicroCavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroCavityAmount" -ln "MicroCavityAmount" + -nn "Micro Cavity Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Name" -ln "UseMicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Type" -ln "UseMicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroNormalTexture" -ln "UseMicroNormalTexture" + -nn "Use Micro Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Name" -ln "MicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Type" -ln "MicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroNormalTexture" -ln "MicroNormalTexture" + -nn "Micro Normal Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroNormalTextureR" -ln "MicroNormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureG" -ln "MicroNormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureB" -ln "MicroNormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Name" -ln "MicroNormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Type" -ln "MicroNormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroNormalHeight" -ln "MicroNormalHeight" + -nn "Micro Normal Height" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 5 -at "float"; + addAttr -is true -ci true -h true -sn "MicroScale_Name" -ln "MicroScale_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "MicroScale_Type" -ln "MicroScale_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "MicroScale" -ln "MicroScale" -nn "Micro Scale" + -ct "HW_shader_parameter" -dv 32 -min 16 -max 99999 -smx 256 -at "float"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Name" -ln "UseBlendTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Type" -ln "UseBlendTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseBlendTexture" -ln "UseBlendTexture" -nn "Enable Wrinkle Mixing" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Name" -ln "OcclusionTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Type" -ln "OcclusionTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionTexcoord" -ln "OcclusionTexcoord" + -nn "Ambient Occlusion Map UV" -ct "HW_shader_parameter" -dv 1 -min 0 -max 2 -smn + 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -ci true -sn "Position" -ln "Position" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Position_Name" -ln "Position_Name" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -h true -sn "Position_Source" -ln "Position_Source" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -sn "Position_DefaultTexture" -ln "Position_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Position"; + addAttr -ci true -sn "TexCoord0" -ln "TexCoord0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord0_Name" -ln "TexCoord0_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -h true -sn "TexCoord0_Source" -ln "TexCoord0_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -sn "TexCoord0_DefaultTexture" -ln "TexCoord0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -ci true -sn "TexCoord1" -ln "TexCoord1" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord1_Name" -ln "TexCoord1_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -h true -sn "TexCoord1_Source" -ln "TexCoord1_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -sn "TexCoord1_DefaultTexture" -ln "TexCoord1_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -ci true -sn "TexCoord2" -ln "TexCoord2" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord2_Name" -ln "TexCoord2_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -h true -sn "TexCoord2_Source" -ln "TexCoord2_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -sn "TexCoord2_DefaultTexture" -ln "TexCoord2_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -ci true -sn "Normal" -ln "Normal" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Normal_Name" -ln "Normal_Name" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -h true -sn "Normal_Source" -ln "Normal_Source" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -sn "Normal_DefaultTexture" -ln "Normal_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Normal"; + addAttr -ci true -sn "Binormal0" -ln "Binormal0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Binormal0_Name" -ln "Binormal0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Binormal0"; + addAttr -is true -ci true -h true -sn "Binormal0_Source" -ln "Binormal0_Source" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -is true -ci true -sn "Binormal0_DefaultTexture" -ln "Binormal0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -ci true -sn "Tangent0" -ln "Tangent0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Tangent0_Name" -ln "Tangent0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -h true -sn "Tangent0_Source" -ln "Tangent0_Source" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -sn "Tangent0_DefaultTexture" -ln "Tangent0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Tangent0"; + setAttr ".vpar" -type "stringArray" 7 "Position" "TexCoord0" "TexCoord1" "TexCoord2" "Normal" "Binormal0" "Tangent0" ; + setAttr ".upar" -type "stringArray" 124 "SuperFilterTaps" "shadowMapTexelSize" "IsSwatchRender" "screenSize" "MayaFullScreenGamma" "light0Enable" "light0Type" "light0Pos" "light0Color" "light0Intensity" "light0Dir" "light0ConeAngle" "light0FallOff" "light0AttenScale" "light0ShadowOn" "light1Enable" "light1Type" "light1Pos" "light1Color" "light1Intensity" "light1Dir" "light1ConeAngle" "light1FallOff" "light1AttenScale" "light1ShadowOn" "light2Enable" "light2Type" "light2Pos" "light2Color" "light2Intensity" "light2Dir" "light2ConeAngle" "light2FallOff" "light2AttenScale" "light2ShadowOn" "LinearSpaceLighting" "UseShadows" "shadowMultiplier" "shadowDepthBias" "flipBackfaceNormals" "SkyRotation" "UseDiffuseIBLMap" "DiffuseIBLIntensity" "DiffuseCubeIBL" "UseSpecCubeIBL" "SpecularIBLIntensity" "SpecularCubeIBL" "transpDepthTexture" "opaqueDepthTexture" "UseDiffuseTexture" "UseDiffuseTextureAlpha" "DiffuseTexture" "DiffuseColor" "LutTexture" "DitherTexture" "skinCoeffX" "skinCoeffY" "skinCoeffZ" "NormalBlurring" "UseScatteringRadiusTexture" "ScatteringRadiusTexture" "skinScattering" "shadowBlur" "shadowDither" "shadowScattering" "shadowSaturation" "UseTranslucency" "BackScatteringThicknessTexture" "UseThicknessTexture" "skinScatteringRoughness" "skinScatteringOuterColor" "skinScatteringAmount" "skinAmbientScatteringAmount" "UseSpecularTextureAlpha" "UseSpecularTexture" "SpecularTexture" "SpecularColor" "LobeMix" "Roughness" "UseAmbientOcclusionTexture" "OcclusionTexture" "OcclusionAmount" "UseCavityTexture" "CavityTexture" "CavityAmount" "UseNormalTexture" "NormalTexture" "NormalHeight" "SupportNonUniformScale" "NormalCoordsysX" "NormalCoordsysY" "UseMicroCavityTexture" "MicroCavityTexture" "MicroCavityAmount" "UseMicroNormalTexture" "MicroNormalTexture" "MicroNormalHeight" "MicroScale" "OpacityMaskTexture" "Opacity" "UseOpacityMaskTexture" "OpacityMaskBias" "DisplacementModel" "UseDisplacementMap" "DisplacementTexture" "VectorDisplacementCoordSys" "DisplacementHeight" "DisplacementOffset" "DisplacementClippingBias" "BBoxExtraScale" "TessellationRange" "TessellationMin" "FlatTessellation" "UseBlendTexture" "DiffuseTexcoord" "OcclusionTexcoord" "OpacityMaskTexcoord" "SpecularTexcoord" "NormalTexcoord" "DisplacementTexcoord" "ThicknessTexcoord" "light0ShadowMap" "light1ShadowMap" "light2ShadowMap" ; + setAttr ".s" -type "string" "$PROJECT_ROOT/Common/SourceAssets/shaders/dx11_shd_teeth.fx"; + setAttr ".t" -type "string" "TessellationOFF"; + setAttr ".SuperFilterTaps_Name" -type "string" "SuperFilterTaps"; + setAttr ".SuperFilterTaps_Type" -type "string" "float1x2"; + setAttr ".SuperFilterTaps" -type "float2" -0.84052002 -0.073954001 ; + setAttr ".shadowMapTexelSize_Name" -type "string" "shadowMapTexelSize"; + setAttr ".shadowMapTexelSize_Type" -type "string" "float"; + setAttr ".shadowMapTexelSize" 0.0019531298894435167; + setAttr ".LinearSpaceLighting_Name" -type "string" "LinearSpaceLighting"; + setAttr ".LinearSpaceLighting_Type" -type "string" "bool"; + setAttr -k on ".LinearSpaceLighting" yes; + setAttr ".UseShadows_Name" -type "string" "UseShadows"; + setAttr ".UseShadows_Type" -type "string" "bool"; + setAttr -k on ".UseShadows" yes; + setAttr ".shadowMultiplier_Name" -type "string" "shadowMultiplier"; + setAttr ".shadowMultiplier_Type" -type "string" "float"; + setAttr -k on ".shadowMultiplier" 1; + setAttr ".IsSwatchRender_Name" -type "string" "IsSwatchRender"; + setAttr ".IsSwatchRender_Type" -type "string" "bool"; + setAttr ".IsSwatchRender" no; + setAttr ".shadowDepthBias_Name" -type "string" "shadowDepthBias"; + setAttr ".shadowDepthBias_Type" -type "string" "float"; + setAttr -k on ".shadowDepthBias" 0.0099999997764825821; + setAttr ".MayaFullScreenGamma_Name" -type "string" "MayaFullScreenGamma"; + setAttr ".MayaFullScreenGamma_Type" -type "string" "bool"; + setAttr ".MayaFullScreenGamma" no; + setAttr ".flipBackfaceNormals_Name" -type "string" "flipBackfaceNormals"; + setAttr ".flipBackfaceNormals_Type" -type "string" "bool"; + setAttr -k on ".flipBackfaceNormals" yes; + setAttr ".light0Enable_Name" -type "string" "light0Enable"; + setAttr ".light0Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light0Enable" no; + setAttr ".light0Type_Name" -type "string" "light0Type"; + setAttr ".light0Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light0Type" 2; + setAttr ".light0Pos_Name" -type "string" "light0Pos"; + setAttr ".light0Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 100 1; + setAttr ".light0Color_Name" -type "string" "light0Color"; + setAttr ".light0Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light0Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light0Color"; + setAttr ".light0Intensity_Name" -type "string" "light0Intensity"; + setAttr ".light0Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light0Intensity" 1; + setAttr ".light0Dir_Name" -type "string" "light0Dir"; + setAttr ".light0Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light0ConeAngle_Name" -type "string" "light0ConeAngle"; + setAttr ".light0ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light0ConeAngle" 0.46000000834465027; + setAttr ".light0FallOff_Name" -type "string" "light0FallOff"; + setAttr ".light0FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light0FallOff" 0.69999998807907104; + setAttr ".light0AttenScale_Name" -type "string" "light0AttenScale"; + setAttr ".light0AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light0AttenScale" 0; + setAttr ".light0ShadowOn_Name" -type "string" "light0ShadowOn"; + setAttr ".light0ShadowOn_Type" -type "string" "bool"; + setAttr ".light0ShadowOn" yes; + setAttr ".light1Enable_Name" -type "string" "light1Enable"; + setAttr ".light1Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light1Enable" no; + setAttr ".light1Type_Name" -type "string" "light1Type"; + setAttr ".light1Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light1Type" 2; + setAttr ".light1Pos_Name" -type "string" "light1Pos"; + setAttr ".light1Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 -100 100 100 1; + setAttr ".light1Color_Name" -type "string" "light1Color"; + setAttr ".light1Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light1Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light1Color"; + setAttr ".light1Intensity_Name" -type "string" "light1Intensity"; + setAttr ".light1Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light1Intensity" 1; + setAttr ".light1Dir_Name" -type "string" "light1Dir"; + setAttr ".light1Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light1ConeAngle_Name" -type "string" "light1ConeAngle"; + setAttr ".light1ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light1ConeAngle" 45; + setAttr ".light1FallOff_Name" -type "string" "light1FallOff"; + setAttr ".light1FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light1FallOff" 0; + setAttr ".light1AttenScale_Name" -type "string" "light1AttenScale"; + setAttr ".light1AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light1AttenScale" 0; + setAttr ".light1ShadowOn_Name" -type "string" "light1ShadowOn"; + setAttr ".light1ShadowOn_Type" -type "string" "bool"; + setAttr ".light1ShadowOn" yes; + setAttr ".light2Enable_Name" -type "string" "light2Enable"; + setAttr ".light2Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light2Enable" no; + setAttr ".light2Type_Name" -type "string" "light2Type"; + setAttr ".light2Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light2Type" 2; + setAttr ".light2Pos_Name" -type "string" "light2Pos"; + setAttr ".light2Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 -100 1; + setAttr ".light2Color_Name" -type "string" "light2Color"; + setAttr ".light2Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light2Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light2Color"; + setAttr ".light2Intensity_Name" -type "string" "light2Intensity"; + setAttr ".light2Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light2Intensity" 1; + setAttr ".light2Dir_Name" -type "string" "light2Dir"; + setAttr ".light2Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light2ConeAngle_Name" -type "string" "light2ConeAngle"; + setAttr ".light2ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light2ConeAngle" 45; + setAttr ".light2FallOff_Name" -type "string" "light2FallOff"; + setAttr ".light2FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light2FallOff" 0; + setAttr ".light2AttenScale_Name" -type "string" "light2AttenScale"; + setAttr ".light2AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light2AttenScale" 0; + setAttr ".light2ShadowOn_Name" -type "string" "light2ShadowOn"; + setAttr ".light2ShadowOn_Type" -type "string" "bool"; + setAttr ".light2ShadowOn" yes; + setAttr ".UseAmbientOcclusionTexture_Name" -type "string" "UseAmbientOcclusionTexture"; + setAttr ".UseAmbientOcclusionTexture_Type" -type "string" "bool"; + setAttr -k on ".UseAmbientOcclusionTexture" no; + setAttr ".transpDepthTexture_Name" -type "string" "transpDepthTexture"; + setAttr ".transpDepthTexture_Type" -type "string" "texture"; + setAttr ".transpDepthTexture" -type "float3" 0 0 0 ; + setAttr ".opaqueDepthTexture_Name" -type "string" "opaqueDepthTexture"; + setAttr ".opaqueDepthTexture_Type" -type "string" "texture"; + setAttr ".opaqueDepthTexture" -type "float3" 0 0 0 ; + setAttr ".UseDiffuseTexture_Name" -type "string" "UseDiffuseTexture"; + setAttr ".UseDiffuseTexture_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTexture" yes; + setAttr ".UseDiffuseTextureAlpha_Name" -type "string" "UseDiffuseTextureAlpha"; + setAttr ".UseDiffuseTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTextureAlpha" no; + setAttr ".DiffuseTexture_Name" -type "string" "DiffuseTexture"; + setAttr ".DiffuseTexture_Type" -type "string" "texture"; + setAttr ".DiffuseTexture" -type "float3" 0 0 0 ; + setAttr ".DiffuseColor_Name" -type "string" "DiffuseColor"; + setAttr ".DiffuseColor_Type" -type "string" "color1x3"; + setAttr -k on ".DiffuseColor" -type "float3" 1 1 1 ; + setAttr ".Opacity_Name" -type "string" "Opacity"; + setAttr ".Opacity_Type" -type "string" "float"; + setAttr -k on ".Opacity" 1; + setAttr ".UseOpacityMaskTexture_Name" -type "string" "UseOpacityMaskTexture"; + setAttr ".UseOpacityMaskTexture_Type" -type "string" "bool"; + setAttr -k on ".UseOpacityMaskTexture" no; + setAttr ".OpacityMaskTexture_Name" -type "string" "OpacityMaskTexture"; + setAttr ".OpacityMaskTexture_Type" -type "string" "texture"; + setAttr ".OpacityMaskTexture" -type "float3" 0 0 0 ; + setAttr ".OpacityMaskBias_Name" -type "string" "OpacityMaskBias"; + setAttr ".OpacityMaskBias_Type" -type "string" "float"; + setAttr -k on ".OpacityMaskBias" 0.10000000149011612; + setAttr ".UseSpecularTexture_Name" -type "string" "UseSpecularTexture"; + setAttr ".UseSpecularTexture_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTexture" no; + setAttr ".SpecularTexture_Name" -type "string" "SpecularTexture"; + setAttr ".SpecularTexture_Type" -type "string" "texture"; + setAttr ".SpecularTexture" -type "float3" 0 0 0 ; + setAttr ".SpecularColor_Name" -type "string" "SpecularColor"; + setAttr ".SpecularColor_Type" -type "string" "color1x3"; + setAttr -k on ".SpecularColor" -type "float3" 0.31782946 0.31782946 0.31782946 ; + setAttr ".UseNormalTexture_Name" -type "string" "UseNormalTexture"; + setAttr ".UseNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseNormalTexture" yes; + setAttr ".NormalTexture_Name" -type "string" "NormalTexture"; + setAttr ".NormalTexture_Type" -type "string" "texture"; + setAttr ".NormalTexture" -type "float3" 0 0 0 ; + setAttr ".NormalHeight_Name" -type "string" "NormalHeight"; + setAttr ".NormalHeight_Type" -type "string" "float"; + setAttr -k on ".NormalHeight" 1.1000000238418579; + setAttr ".SupportNonUniformScale_Name" -type "string" "SupportNonUniformScale"; + setAttr ".SupportNonUniformScale_Type" -type "string" "bool"; + setAttr -k on ".SupportNonUniformScale" yes; + setAttr ".NormalCoordsysX_Name" -type "string" "NormalCoordsysX"; + setAttr ".NormalCoordsysX_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysX" 0; + setAttr ".NormalCoordsysY_Name" -type "string" "NormalCoordsysY"; + setAttr ".NormalCoordsysY_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysY" 0; + setAttr ".DisplacementModel_Name" -type "string" "DisplacementModel"; + setAttr ".DisplacementModel_Type" -type "string" "enum"; + setAttr -k on ".DisplacementModel" 0; + setAttr ".UseDisplacementMap_Name" -type "string" "UseDisplacementMap"; + setAttr ".UseDisplacementMap_Type" -type "string" "bool"; + setAttr -k on ".UseDisplacementMap" no; + setAttr ".DisplacementTexture_Name" -type "string" "DisplacementTexture"; + setAttr ".DisplacementTexture_Type" -type "string" "texture"; + setAttr ".DisplacementTexture" -type "float3" 0 0 0 ; + setAttr ".VectorDisplacementCoordSys_Name" -type "string" "VectorDisplacementCoordSys"; + setAttr ".VectorDisplacementCoordSys_Type" -type "string" "enum"; + setAttr -k on ".VectorDisplacementCoordSys" 0; + setAttr ".DisplacementHeight_Name" -type "string" "DisplacementHeight"; + setAttr ".DisplacementHeight_Type" -type "string" "float"; + setAttr -k on ".DisplacementHeight" 0.5; + setAttr ".DisplacementOffset_Name" -type "string" "DisplacementOffset"; + setAttr ".DisplacementOffset_Type" -type "string" "float"; + setAttr -k on ".DisplacementOffset" 0.5; + setAttr ".DisplacementClippingBias_Name" -type "string" "DisplacementClippingBias"; + setAttr ".DisplacementClippingBias_Type" -type "string" "float"; + setAttr -k on ".DisplacementClippingBias" 5; + setAttr ".BBoxExtraScale_Name" -type "string" "BBoxExtraScale"; + setAttr ".BBoxExtraScale_Type" -type "string" "float"; + setAttr -k on ".BBoxExtraScale" 1; + setAttr ".TessellationRange_Name" -type "string" "TessellationRange"; + setAttr ".TessellationRange_Type" -type "string" "float"; + setAttr -k on ".TessellationRange" 0; + setAttr ".TessellationMin_Name" -type "string" "TessellationMin"; + setAttr ".TessellationMin_Type" -type "string" "float"; + setAttr -k on ".TessellationMin" 3; + setAttr ".FlatTessellation_Name" -type "string" "FlatTessellation"; + setAttr ".FlatTessellation_Type" -type "string" "float"; + setAttr -k on ".FlatTessellation" 0; + setAttr ".UseTranslucency_Name" -type "string" "UseTranslucency"; + setAttr ".UseTranslucency_Type" -type "string" "bool"; + setAttr -k on ".UseTranslucency" no; + setAttr ".UseThicknessTexture_Name" -type "string" "UseThicknessTexture"; + setAttr ".UseThicknessTexture_Type" -type "string" "bool"; + setAttr -k on ".UseThicknessTexture" no; + setAttr ".UseDiffuseIBLMap_Name" -type "string" "UseDiffuseIBLMap"; + setAttr ".UseDiffuseIBLMap_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseIBLMap" yes; + setAttr ".DiffuseIBLIntensity_Name" -type "string" "DiffuseIBLIntensity"; + setAttr ".DiffuseIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".DiffuseIBLIntensity" 0.60000002384185791; + setAttr ".DiffuseTexcoord_Name" -type "string" "DiffuseTexcoord"; + setAttr ".DiffuseTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DiffuseTexcoord" 0; + setAttr ".OpacityMaskTexcoord_Name" -type "string" "OpacityMaskTexcoord"; + setAttr ".OpacityMaskTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OpacityMaskTexcoord" 0; + setAttr ".SpecularTexcoord_Name" -type "string" "SpecularTexcoord"; + setAttr ".SpecularTexcoord_Type" -type "string" "enum"; + setAttr -k on ".SpecularTexcoord" 0; + setAttr ".NormalTexcoord_Name" -type "string" "NormalTexcoord"; + setAttr ".NormalTexcoord_Type" -type "string" "enum"; + setAttr -k on ".NormalTexcoord" 0; + setAttr ".DisplacementTexcoord_Name" -type "string" "DisplacementTexcoord"; + setAttr ".DisplacementTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DisplacementTexcoord" 0; + setAttr ".ThicknessTexcoord_Name" -type "string" "ThicknessTexcoord"; + setAttr ".ThicknessTexcoord_Type" -type "string" "enum"; + setAttr -k on ".ThicknessTexcoord" 0; + setAttr ".light0ShadowMap_Name" -type "string" "light0ShadowMap"; + setAttr ".light0ShadowMap_Type" -type "string" "texture"; + setAttr ".light0ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light1ShadowMap_Name" -type "string" "light1ShadowMap"; + setAttr ".light1ShadowMap_Type" -type "string" "texture"; + setAttr ".light1ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light2ShadowMap_Name" -type "string" "light2ShadowMap"; + setAttr ".light2ShadowMap_Type" -type "string" "texture"; + setAttr ".light2ShadowMap" -type "float3" 0 0 0 ; + setAttr ".screenSize_Name" -type "string" "screenSize"; + setAttr ".screenSize_Type" -type "string" "float1x2"; + setAttr ".screenSize" -type "float2" 0 0 ; + setAttr ".SkyRotation_Name" -type "string" "SkyRotation"; + setAttr ".SkyRotation_Type" -type "string" "float"; + setAttr -k on ".SkyRotation" 12.5; + setAttr ".DiffuseCubeIBL_Name" -type "string" "DiffuseCubeIBL"; + setAttr ".DiffuseCubeIBL_Type" -type "string" "texture"; + setAttr ".DiffuseCubeIBL" -type "float3" 0 0 0 ; + setAttr ".UseSpecCubeIBL_Name" -type "string" "UseSpecCubeIBL"; + setAttr ".UseSpecCubeIBL_Type" -type "string" "bool"; + setAttr -k on ".UseSpecCubeIBL" yes; + setAttr ".SpecularIBLIntensity_Name" -type "string" "SpecularIBLIntensity"; + setAttr ".SpecularIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".SpecularIBLIntensity" 0.28499999642372131; + setAttr ".SpecularCubeIBL_Name" -type "string" "SpecularCubeIBL"; + setAttr ".SpecularCubeIBL_Type" -type "string" "texture"; + setAttr ".SpecularCubeIBL" -type "float3" 0 0 0 ; + setAttr ".LutTexture_Name" -type "string" "LutTexture"; + setAttr ".LutTexture_Type" -type "string" "texture"; + setAttr ".LutTexture" -type "float3" 0 0 0 ; + setAttr ".DitherTexture_Name" -type "string" "DitherTexture"; + setAttr ".DitherTexture_Type" -type "string" "texture"; + setAttr ".DitherTexture" -type "float3" 0 0 0 ; + setAttr ".skinCoeffX_Name" -type "string" "skinCoeffX"; + setAttr ".skinCoeffX_Type" -type "string" "float"; + setAttr -k on ".skinCoeffX" 0.82099997997283936; + setAttr ".skinCoeffY_Name" -type "string" "skinCoeffY"; + setAttr ".skinCoeffY_Type" -type "string" "float"; + setAttr -k on ".skinCoeffY" 0.33199998736381531; + setAttr ".skinCoeffZ_Name" -type "string" "skinCoeffZ"; + setAttr ".skinCoeffZ_Type" -type "string" "float"; + setAttr -k on ".skinCoeffZ" 0.030999999493360519; + setAttr ".NormalBlurring_Name" -type "string" "NormalBlurring"; + setAttr ".NormalBlurring_Type" -type "string" "float"; + setAttr -k on ".NormalBlurring" 1; + setAttr ".ScatteringRadiusTexture_Name" -type "string" "ScatteringRadiusTexture"; + setAttr ".ScatteringRadiusTexture_Type" -type "string" "texture"; + setAttr ".ScatteringRadiusTexture" -type "float3" 0 0 0 ; + setAttr ".UseScatteringRadiusTexture_Name" -type "string" "UseScatteringRadiusTexture"; + setAttr ".UseScatteringRadiusTexture_Type" -type "string" "bool"; + setAttr -k on ".UseScatteringRadiusTexture" no; + setAttr ".skinScattering_Name" -type "string" "skinScattering"; + setAttr ".skinScattering_Type" -type "string" "float"; + setAttr -k on ".skinScattering" 0.43700000643730164; + setAttr ".shadowBlur_Name" -type "string" "shadowBlur"; + setAttr ".shadowBlur_Type" -type "string" "float"; + setAttr -k on ".shadowBlur" 1; + setAttr ".shadowDither_Name" -type "string" "shadowDither"; + setAttr ".shadowDither_Type" -type "string" "float"; + setAttr -k on ".shadowDither" 0.086999997496604919; + setAttr ".shadowScattering_Name" -type "string" "shadowScattering"; + setAttr ".shadowScattering_Type" -type "string" "float"; + setAttr -k on ".shadowScattering" 1; + setAttr ".shadowSaturation_Name" -type "string" "shadowSaturation"; + setAttr ".shadowSaturation_Type" -type "string" "float"; + setAttr -k on ".shadowSaturation" 1.2740000486373901; + setAttr ".BackScatteringThicknessTexture_Name" -type "string" "BackScatteringThicknessTexture"; + setAttr ".BackScatteringThicknessTexture_Type" -type "string" "texture"; + setAttr ".BackScatteringThicknessTexture" -type "float3" 0 0 0 ; + setAttr ".skinScatteringRoughness_Name" -type "string" "skinScatteringRoughness"; + setAttr ".skinScatteringRoughness_Type" -type "string" "float"; + setAttr -k on ".skinScatteringRoughness" 1; + setAttr ".skinScatteringOuterColor_Name" -type "string" "skinScatteringOuterColor"; + setAttr ".skinScatteringOuterColor_Type" -type "string" "color1x3"; + setAttr -k on ".skinScatteringOuterColor" -type "float3" 0.39607844 0.039215688 + 0 ; + setAttr ".skinScatteringAmount_Name" -type "string" "skinScatteringAmount"; + setAttr ".skinScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinScatteringAmount" 0.57599997520446777; + setAttr ".skinAmbientScatteringAmount_Name" -type "string" "skinAmbientScatteringAmount"; + setAttr ".skinAmbientScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinAmbientScatteringAmount" 2.1779999732971191; + setAttr ".UseSpecularTextureAlpha_Name" -type "string" "UseSpecularTextureAlpha"; + setAttr ".UseSpecularTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTextureAlpha" no; + setAttr ".LobeMix_Name" -type "string" "LobeMix"; + setAttr ".LobeMix_Type" -type "string" "float"; + setAttr -k on ".LobeMix" 0.6940000057220459; + setAttr ".Roughness_Name" -type "string" "Roughness"; + setAttr ".Roughness_Type" -type "string" "float"; + setAttr -k on ".Roughness" 0.17000000178813934; + setAttr ".OcclusionTexture_Name" -type "string" "OcclusionTexture"; + setAttr ".OcclusionTexture_Type" -type "string" "texture"; + setAttr ".OcclusionTexture" -type "float3" 0 0 0 ; + setAttr ".OcclusionAmount_Name" -type "string" "OcclusionAmount"; + setAttr ".OcclusionAmount_Type" -type "string" "float"; + setAttr -k on ".OcclusionAmount" 0.5; + setAttr ".UseCavityTexture_Name" -type "string" "UseCavityTexture"; + setAttr ".UseCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseCavityTexture" no; + setAttr ".CavityTexture_Name" -type "string" "CavityTexture"; + setAttr ".CavityTexture_Type" -type "string" "texture"; + setAttr ".CavityTexture" -type "float3" 0 0 0 ; + setAttr ".CavityAmount_Name" -type "string" "CavityAmount"; + setAttr ".CavityAmount_Type" -type "string" "float"; + setAttr -k on ".CavityAmount" 1; + setAttr ".UseMicroCavityTexture_Name" -type "string" "UseMicroCavityTexture"; + setAttr ".UseMicroCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroCavityTexture" no; + setAttr ".MicroCavityTexture_Name" -type "string" "MicroCavityTexture"; + setAttr ".MicroCavityTexture_Type" -type "string" "texture"; + setAttr ".MicroCavityTexture" -type "float3" 0 0 0 ; + setAttr ".MicroCavityAmount_Name" -type "string" "MicroCavityAmount"; + setAttr ".MicroCavityAmount_Type" -type "string" "float"; + setAttr -k on ".MicroCavityAmount" 1; + setAttr ".UseMicroNormalTexture_Name" -type "string" "UseMicroNormalTexture"; + setAttr ".UseMicroNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroNormalTexture" no; + setAttr ".MicroNormalTexture_Name" -type "string" "MicroNormalTexture"; + setAttr ".MicroNormalTexture_Type" -type "string" "texture"; + setAttr ".MicroNormalTexture" -type "float3" 0 0 0 ; + setAttr ".MicroNormalHeight_Name" -type "string" "MicroNormalHeight"; + setAttr ".MicroNormalHeight_Type" -type "string" "float"; + setAttr -k on ".MicroNormalHeight" 1; + setAttr ".MicroScale_Name" -type "string" "MicroScale"; + setAttr ".MicroScale_Type" -type "string" "float"; + setAttr -k on ".MicroScale" 32; + setAttr ".UseBlendTexture_Name" -type "string" "UseBlendTexture"; + setAttr ".UseBlendTexture_Type" -type "string" "bool"; + setAttr -k on ".UseBlendTexture" no; + setAttr ".OcclusionTexcoord_Name" -type "string" "OcclusionTexcoord"; + setAttr ".OcclusionTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OcclusionTexcoord" 1; + setAttr ".Position_Name" -type "string" "Position"; + setAttr ".Position_Source" -type "string" "position"; + setAttr ".TexCoord0_Name" -type "string" "TexCoord0"; + setAttr ".TexCoord0_Source" -type "string" "uv:map1"; + setAttr ".TexCoord0_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord1_Name" -type "string" "TexCoord1"; + setAttr ".TexCoord1_Source" -type "string" "uv:map2"; + setAttr ".TexCoord1_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord2_Name" -type "string" "TexCoord2"; + setAttr ".TexCoord2_Source" -type "string" "uv:map3"; + setAttr ".TexCoord2_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".Normal_Name" -type "string" "Normal"; + setAttr ".Normal_Source" -type "string" "normal"; + setAttr ".Binormal0_Name" -type "string" "Binormal0"; + setAttr ".Binormal0_Source" -type "string" "binormal:map1"; + setAttr ".Tangent0_Name" -type "string" "Tangent0"; + setAttr ".Tangent0_Source" -type "string" "tangent:map1"; +createNode shadingEngine -n "shader_teeth_shaderSG"; + rename -uid "51CB22C4-43CA-9103-CBF3-74B388A08266"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo2"; + rename -uid "7ED32CAE-4E47-D908-0D6D-4A99A34A453F"; +createNode blinn -n "shader_saliva_shader"; + rename -uid "F274448E-485C-FB4F-9DD5-6691A33FEB35"; + setAttr ".it" -type "float3" 0.89999998 0.89999998 0.89999998 ; + setAttr ".sc" -type "float3" 0.25 0.25 0.25 ; + setAttr ".ec" 0.20000000298023224; + setAttr ".sro" 0.20000000298023224; +createNode shadingEngine -n "shader_saliva_shaderSG"; + rename -uid "D419A0A6-42AE-5436-DC24-4AAE57B3B70A"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo3"; + rename -uid "A49D0A41-46BA-F304-EFF0-88A96FA4DE2A"; +createNode dx11Shader -n "shader_eyeLeft_shader"; + rename -uid "7E8AE3FD-4462-FB83-0A75-24A62904BD10"; + addAttr -s false -is true -ci true -k true -sn "te" -ln "techniqueEnum" -nn "Technique" + -ct "HW_shader_parameter" -min 0 -max 2 -en "TessellationOFF" -at "enum"; + addAttr -ci true -sn "Light_0_use_implicit_lighting" -ln "Light_0_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_0_connected_light" -ln "Light_0_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_1_use_implicit_lighting" -ln "Light_1_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_1_connected_light" -ln "Light_1_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_2_use_implicit_lighting" -ln "Light_2_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_2_connected_light" -ln "Light_2_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Name" -ln "SuperFilterTaps_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Type" -ln "SuperFilterTaps_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps" -ln "SuperFilterTaps" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "SuperFilterTapsX" -ln "SuperFilterTapsX" -ct "HW_shader_parameter" + -dv -0.84052002429962158 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -sn "SuperFilterTapsY" -ln "SuperFilterTapsY" -ct "HW_shader_parameter" + -dv -0.073954001069068909 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Name" -ln "shadowMapTexelSize_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Type" -ln "shadowMapTexelSize_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize" -ln "shadowMapTexelSize" + -ct "HW_shader_parameter" -dv 0.0019531298894435167 -smn 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Name" -ln "LinearSpaceLighting_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Type" -ln "LinearSpaceLighting_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "LinearSpaceLighting" -ln "LinearSpaceLighting" + -nn "Linear Space Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseShadows_Name" -ln "UseShadows_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "UseShadows_Type" -ln "UseShadows_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "UseShadows" -ln "UseShadows" -nn "Shadows" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Name" -ln "shadowMultiplier_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Type" -ln "shadowMultiplier_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowMultiplier" -ln "shadowMultiplier" + -nn "Shadow Strength" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Name" -ln "IsSwatchRender_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Type" -ln "IsSwatchRender_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender" -ln "IsSwatchRender" -ct "HW_shader_parameter" + -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Name" -ln "shadowDepthBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Type" -ln "shadowDepthBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDepthBias" -ln "shadowDepthBias" -nn "Shadow Bias" + -ct "HW_shader_parameter" -dv 0.0099999997764825821 -min 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Name" -ln "MayaFullScreenGamma_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Type" -ln "MayaFullScreenGamma_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma" -ln "MayaFullScreenGamma" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Name" -ln "flipBackfaceNormals_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Type" -ln "flipBackfaceNormals_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "flipBackfaceNormals" -ln "flipBackfaceNormals" + -nn "Double Sided Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Enable_Name" -ln "light0Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Enable_Type" -ln "light0Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Enable" -ln "light0Enable" -nn "Enable Light 0" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Type_Name" -ln "light0Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Type_Type" -ln "light0Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Type" -ln "light0Type" -nn "Light 0 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light0Pos_Name" -ln "light0Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Pos_Type" -ln "light0Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Pos" -ln "light0Pos" -nn "Light 0 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0Color_Name" -ln "light0Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Color_Type" -ln "light0Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light0Color" -ln "light0Color" -nn "Light 0 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ColorR" -ln "light0ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorG" -ln "light0ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorB" -ln "light0ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -h true -sn "light0Intensity_Name" -ln "light0Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Intensity_Type" -ln "light0Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Intensity" -ln "light0Intensity" -nn "Light 0 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0Dir_Name" -ln "light0Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Dir_Type" -ln "light0Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Dir" -ln "light0Dir" -nn "Light 0 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Name" -ln "light0ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Type" -ln "light0ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0ConeAngle" -ln "light0ConeAngle" -nn "Light 0 Cone Angle" + -ct "HW_shader_parameter" -dv 0.46000000834465027 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0FallOff_Name" -ln "light0FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0FallOff_Type" -ln "light0FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0FallOff" -ln "light0FallOff" -nn "Light 0 Penumbra Angle" + -ct "HW_shader_parameter" -dv 0.69999998807907104 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Name" -ln "light0AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Type" -ln "light0AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0AttenScale" -ln "light0AttenScale" + -nn "Light 0 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Name" -ln "light0ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Type" -ln "light0ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn" -ln "light0ShadowOn" -nn "Light 0 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Enable_Name" -ln "light1Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Enable_Type" -ln "light1Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Enable" -ln "light1Enable" -nn "Enable Light 1" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Type_Name" -ln "light1Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Type_Type" -ln "light1Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Type" -ln "light1Type" -nn "Light 1 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light1Pos_Name" -ln "light1Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Pos_Type" -ln "light1Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Pos" -ln "light1Pos" -nn "Light 1 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1Color_Name" -ln "light1Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Color_Type" -ln "light1Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light1Color" -ln "light1Color" -nn "Light 1 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ColorR" -ln "light1ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorG" -ln "light1ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorB" -ln "light1ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -h true -sn "light1Intensity_Name" -ln "light1Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Intensity_Type" -ln "light1Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Intensity" -ln "light1Intensity" -nn "Light 1 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1Dir_Name" -ln "light1Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Dir_Type" -ln "light1Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Dir" -ln "light1Dir" -nn "Light 1 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Name" -ln "light1ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Type" -ln "light1ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1ConeAngle" -ln "light1ConeAngle" -nn "Light 1 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1FallOff_Name" -ln "light1FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1FallOff_Type" -ln "light1FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1FallOff" -ln "light1FallOff" -nn "Light 1 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Name" -ln "light1AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Type" -ln "light1AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1AttenScale" -ln "light1AttenScale" + -nn "Light 1 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Name" -ln "light1ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Type" -ln "light1ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn" -ln "light1ShadowOn" -nn "Light 1 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Enable_Name" -ln "light2Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Enable_Type" -ln "light2Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Enable" -ln "light2Enable" -nn "Enable Light 2" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Type_Name" -ln "light2Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Type_Type" -ln "light2Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Type" -ln "light2Type" -nn "Light 2 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light2Pos_Name" -ln "light2Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Pos_Type" -ln "light2Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Pos" -ln "light2Pos" -nn "Light 2 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2Color_Name" -ln "light2Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Color_Type" -ln "light2Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light2Color" -ln "light2Color" -nn "Light 2 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ColorR" -ln "light2ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorG" -ln "light2ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorB" -ln "light2ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -h true -sn "light2Intensity_Name" -ln "light2Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Intensity_Type" -ln "light2Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Intensity" -ln "light2Intensity" -nn "Light 2 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2Dir_Name" -ln "light2Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Dir_Type" -ln "light2Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Dir" -ln "light2Dir" -nn "Light 2 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Name" -ln "light2ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Type" -ln "light2ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2ConeAngle" -ln "light2ConeAngle" -nn "Light 2 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2FallOff_Name" -ln "light2FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2FallOff_Type" -ln "light2FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2FallOff" -ln "light2FallOff" -nn "Light 2 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Name" -ln "light2AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Type" -ln "light2AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2AttenScale" -ln "light2AttenScale" + -nn "Light 2 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Name" -ln "light2ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Type" -ln "light2ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn" -ln "light2ShadowOn" -nn "Light 2 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Name" -ln "UseAmbientOcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Type" -ln "UseAmbientOcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseAmbientOcclusionTexture" -ln "UseAmbientOcclusionTexture" + -nn "Use Occlusion Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Name" -ln "transpDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Type" -ln "transpDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "transpDepthTexture" -ln "transpDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "transpDepthTextureR" -ln "transpDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureG" -ln "transpDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureB" -ln "transpDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Name" -ln "opaqueDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Type" -ln "opaqueDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "opaqueDepthTexture" -ln "opaqueDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "opaqueDepthTextureR" -ln "opaqueDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureG" -ln "opaqueDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureB" -ln "opaqueDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Name" -ln "UseDiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Type" -ln "UseDiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTexture" -ln "UseDiffuseTexture" + -nn "Use Diffuse Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Name" -ln "UseDiffuseTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Type" -ln "UseDiffuseTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTextureAlpha" -ln "UseDiffuseTextureAlpha" + -nn "Use Diffuse Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Name" -ln "DiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Type" -ln "DiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseTexture" -ln "DiffuseTexture" -nn "Diffuse Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseTextureR" -ln "DiffuseTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureG" -ln "DiffuseTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureB" -ln "DiffuseTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Name" -ln "DiffuseColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Type" -ln "DiffuseColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "DiffuseColor" -ln "DiffuseColor" -nn "Diffuse Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseColorR" -ln "DiffuseColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorG" -ln "DiffuseColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorB" -ln "DiffuseColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -h true -sn "Opacity_Name" -ln "Opacity_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Opacity_Type" -ln "Opacity_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Opacity" -ln "Opacity" -nn "Opacity" -ct "HW_shader_parameter" + -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Name" -ln "UseOpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Type" -ln "UseOpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseOpacityMaskTexture" -ln "UseOpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Name" -ln "OpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Type" -ln "OpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OpacityMaskTexture" -ln "OpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OpacityMaskTextureR" -ln "OpacityMaskTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureG" -ln "OpacityMaskTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureB" -ln "OpacityMaskTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Name" -ln "OpacityMaskBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Type" -ln "OpacityMaskBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskBias" -ln "OpacityMaskBias" -nn "Opacity Mask Bias" + -ct "HW_shader_parameter" -dv 0.10000000149011612 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Name" -ln "UseSpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Type" -ln "UseSpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTexture" -ln "UseSpecularTexture" + -nn "Use Specular Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Name" -ln "SpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Type" -ln "SpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularTexture" -ln "SpecularTexture" -nn "Specular Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularTextureR" -ln "SpecularTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureG" -ln "SpecularTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureB" -ln "SpecularTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -h true -sn "SpecularColor_Name" -ln "SpecularColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularColor_Type" -ln "SpecularColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "SpecularColor" -ln "SpecularColor" -nn "Specular Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularColorR" -ln "SpecularColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorG" -ln "SpecularColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorB" -ln "SpecularColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Name" -ln "UseNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Type" -ln "UseNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseNormalTexture" -ln "UseNormalTexture" + -nn "Use Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalTexture_Name" -ln "NormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexture_Type" -ln "NormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "NormalTexture" -ln "NormalTexture" -nn "Normal Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "NormalTextureR" -ln "NormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureG" -ln "NormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureB" -ln "NormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -h true -sn "NormalHeight_Name" -ln "NormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalHeight_Type" -ln "NormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalHeight" -ln "NormalHeight" -nn "Normal Height" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx 5 -at "float"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Name" -ln "SupportNonUniformScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Type" -ln "SupportNonUniformScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SupportNonUniformScale" -ln "SupportNonUniformScale" + -nn "Support Non-Uniform Scale" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Name" -ln "NormalCoordsysX_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Type" -ln "NormalCoordsysX_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysX" -ln "NormalCoordsysX" -nn "Normal X (Red)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Name" -ln "NormalCoordsysY_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Type" -ln "NormalCoordsysY_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysY" -ln "NormalCoordsysY" -nn "Normal Y (Green)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Name" -ln "DisplacementModel_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Type" -ln "DisplacementModel_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementModel" -ln "DisplacementModel" + -nn "Displacement Model" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en + "Grayscale:Tangent Vector" -at "enum"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Name" -ln "UseDisplacementMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Type" -ln "UseDisplacementMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDisplacementMap" -ln "UseDisplacementMap" + -nn "Displacement Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Name" -ln "DisplacementTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Type" -ln "DisplacementTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DisplacementTexture" -ln "DisplacementTexture" + -nn "Displacement Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DisplacementTextureR" -ln "DisplacementTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureG" -ln "DisplacementTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureB" -ln "DisplacementTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Name" -ln "VectorDisplacementCoordSys_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Type" -ln "VectorDisplacementCoordSys_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "VectorDisplacementCoordSys" -ln "VectorDisplacementCoordSys" + -nn "Displacement Coordsys" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 + -en "Mudbox (XZY):Maya (XYZ)" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Name" -ln "DisplacementHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Type" -ln "DisplacementHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementHeight" -ln "DisplacementHeight" + -nn "Displacement Height" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Name" -ln "DisplacementOffset_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Type" -ln "DisplacementOffset_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementOffset" -ln "DisplacementOffset" + -nn "Displacement Offset" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn -1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Name" -ln "DisplacementClippingBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Type" -ln "DisplacementClippingBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementClippingBias" -ln "DisplacementClippingBias" + -nn "Displacement Clipping Bias" -ct "HW_shader_parameter" -dv 5 -min -99999 -max + 99999 -smn 0 -smx 99 -at "float"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Name" -ln "BBoxExtraScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Type" -ln "BBoxExtraScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "BBoxExtraScale" -ln "BBoxExtraScale" -nn "Bounding Box Extra Scale" + -ct "HW_shader_parameter" -dv 1 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationRange_Name" -ln "TessellationRange_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationRange_Type" -ln "TessellationRange_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationRange" -ln "TessellationRange" + -nn "Tessellation Range" -ct "HW_shader_parameter" -min 0 -max 99999 -smx 999 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationMin_Name" -ln "TessellationMin_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationMin_Type" -ln "TessellationMin_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationMin" -ln "TessellationMin" -nn "Tessellation Minimum" + -ct "HW_shader_parameter" -dv 3 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Name" -ln "FlatTessellation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Type" -ln "FlatTessellation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "FlatTessellation" -ln "FlatTessellation" + -nn "Flat Tessellation" -ct "HW_shader_parameter" -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Name" -ln "UseTranslucency_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Type" -ln "UseTranslucency_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseTranslucency" -ln "UseTranslucency" -nn "Back Scattering" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Name" -ln "UseThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Type" -ln "UseThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseThicknessTexture" -ln "UseThicknessTexture" + -nn "Use Thickness Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Name" -ln "UseDiffuseIBLMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Type" -ln "UseDiffuseIBLMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseIBLMap" -ln "UseDiffuseIBLMap" + -nn "Use Diffuse Cubemap" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Name" -ln "DiffuseIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Type" -ln "DiffuseIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseIBLIntensity" -ln "DiffuseIBLIntensity" + -nn "Diffuse IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Name" -ln "DiffuseTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Type" -ln "DiffuseTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseTexcoord" -ln "DiffuseTexcoord" -nn "Diffuse Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Name" -ln "OpacityMaskTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Type" -ln "OpacityMaskTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskTexcoord" -ln "OpacityMaskTexcoord" + -nn "Opacity Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Name" -ln "SpecularTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Type" -ln "SpecularTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularTexcoord" -ln "SpecularTexcoord" + -nn "Specular Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Name" -ln "NormalTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Type" -ln "NormalTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalTexcoord" -ln "NormalTexcoord" -nn "Normal Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Name" -ln "DisplacementTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Type" -ln "DisplacementTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementTexcoord" -ln "DisplacementTexcoord" + -nn "Displacement Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en + "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Name" -ln "ThicknessTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Type" -ln "ThicknessTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "ThicknessTexcoord" -ln "ThicknessTexcoord" + -nn "Translucency Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 + -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Name" -ln "light0ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Type" -ln "light0ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light0ShadowMap" -ln "light0ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ShadowMapR" -ln "light0ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapG" -ln "light0ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapB" -ln "light0ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Name" -ln "light1ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Type" -ln "light1ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light1ShadowMap" -ln "light1ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ShadowMapR" -ln "light1ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapG" -ln "light1ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapB" -ln "light1ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Name" -ln "light2ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Type" -ln "light2ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light2ShadowMap" -ln "light2ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ShadowMapR" -ln "light2ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapG" -ln "light2ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapB" -ln "light2ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -h true -sn "screenSize_Name" -ln "screenSize_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize_Type" -ln "screenSize_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize" -ln "screenSize" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "screenSizeX" -ln "screenSizeX" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -sn "screenSizeY" -ln "screenSizeY" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -h true -sn "SkyRotation_Name" -ln "SkyRotation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SkyRotation_Type" -ln "SkyRotation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SkyRotation" -ln "SkyRotation" -nn "Sky Rotation" + -ct "HW_shader_parameter" -min 0 -max 99999 -smn 0 -smx 360 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Name" -ln "DiffuseCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Type" -ln "DiffuseCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseCubeIBL" -ln "DiffuseCubeIBL" -nn "Diffuse Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseCubeIBLR" -ln "DiffuseCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLG" -ln "DiffuseCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLB" -ln "DiffuseCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Name" -ln "UseSpecCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Type" -ln "UseSpecCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecCubeIBL" -ln "UseSpecCubeIBL" -nn "Use Specular Cubemap" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Name" -ln "SpecularIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Type" -ln "SpecularIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularIBLIntensity" -ln "SpecularIBLIntensity" + -nn "Specular IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Name" -ln "SpecularCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Type" -ln "SpecularCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularCubeIBL" -ln "SpecularCubeIBL" -nn "Specular Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularCubeIBLR" -ln "SpecularCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLG" -ln "SpecularCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLB" -ln "SpecularCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -h true -sn "LutTexture_Name" -ln "LutTexture_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LutTexture_Type" -ln "LutTexture_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -uac -sn "LutTexture" -ln "LutTexture" -nn "SSS LUT Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "LutTextureR" -ln "LutTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureG" -ln "LutTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureB" -ln "LutTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -h true -sn "DitherTexture_Name" -ln "DitherTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DitherTexture_Type" -ln "DitherTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DitherTexture" -ln "DitherTexture" -nn "SSS Dither Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DitherTextureR" -ln "DitherTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureG" -ln "DitherTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureB" -ln "DitherTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Name" -ln "skinCoeffX_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Type" -ln "skinCoeffX_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffX" -ln "skinCoeffX" -nn "SSS Coeffient R" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Name" -ln "skinCoeffY_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Type" -ln "skinCoeffY_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffY" -ln "skinCoeffY" -nn "SSS Coeffient G" + -ct "HW_shader_parameter" -dv 0.5 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Name" -ln "skinCoeffZ_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Type" -ln "skinCoeffZ_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffZ" -ln "skinCoeffZ" -nn "SSS Coeffient B" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Name" -ln "NormalBlurring_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Type" -ln "NormalBlurring_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalBlurring" -ln "NormalBlurring" -nn "SSS Softness" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Name" -ln "ScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Type" -ln "ScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "ScatteringRadiusTexture" -ln "ScatteringRadiusTexture" + -nn "SSS Radius Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "ScatteringRadiusTextureR" -ln "ScatteringRadiusTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureG" -ln "ScatteringRadiusTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureB" -ln "ScatteringRadiusTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Name" -ln "UseScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Type" -ln "UseScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseScatteringRadiusTexture" -ln "UseScatteringRadiusTexture" + -nn "Use SSS Radius Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "skinScattering_Name" -ln "skinScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScattering_Type" -ln "skinScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScattering" -ln "skinScattering" -nn "SSS Radius" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowBlur_Name" -ln "shadowBlur_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "shadowBlur_Type" -ln "shadowBlur_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "shadowBlur" -ln "shadowBlur" -nn "SSS Shadow Blur" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowDither_Name" -ln "shadowDither_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDither_Type" -ln "shadowDither_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDither" -ln "shadowDither" -nn "SSS Shadow Dither" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowScattering_Name" -ln "shadowScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowScattering_Type" -ln "shadowScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowScattering" -ln "shadowScattering" + -nn "SSS Shadow Scattering" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Name" -ln "shadowSaturation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Type" -ln "shadowSaturation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowSaturation" -ln "shadowSaturation" + -nn "SSS Shadow Saturation" -ct "HW_shader_parameter" -dv 1 -min 0 -max 4 -smx 4 + -at "float"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Name" -ln "BackScatteringThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Type" -ln "BackScatteringThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "BackScatteringThicknessTexture" -ln "BackScatteringThicknessTexture" + -nn "Thickness Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureR" -ln "BackScatteringThicknessTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureG" -ln "BackScatteringThicknessTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureB" -ln "BackScatteringThicknessTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Name" -ln "skinScatteringRoughness_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Type" -ln "skinScatteringRoughness_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringRoughness" -ln "skinScatteringRoughness" + -nn "Back Scattering Width" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Name" -ln "skinScatteringOuterColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Type" -ln "skinScatteringOuterColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "skinScatteringOuterColor" -ln "skinScatteringOuterColor" + -nn "Back Scattering Color" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "skinScatteringOuterColorR" -ln "skinScatteringOuterColorR" + -ct "HW_shader_parameter" -dv 0.25 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorG" -ln "skinScatteringOuterColorG" + -ct "HW_shader_parameter" -dv 0.05000000074505806 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorB" -ln "skinScatteringOuterColorB" + -ct "HW_shader_parameter" -dv 0.019999999552965164 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Name" -ln "skinScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Type" -ln "skinScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringAmount" -ln "skinScatteringAmount" + -nn "Back Scattering Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 6 -smx 6 + -at "float"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Name" -ln "skinAmbientScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Type" -ln "skinAmbientScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinAmbientScatteringAmount" -ln "skinAmbientScatteringAmount" + -nn "Back Scattering Ambient Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max + 6 -smx 6 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Name" -ln "UseSpecularTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Type" -ln "UseSpecularTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTextureAlpha" -ln "UseSpecularTextureAlpha" + -nn "Use Roughness Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "LobeMix_Name" -ln "LobeMix_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LobeMix_Type" -ln "LobeMix_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "LobeMix" -ln "LobeMix" -nn "Lobe Mixing" + -ct "HW_shader_parameter" -dv 0.75 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "Roughness_Name" -ln "Roughness_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Roughness_Type" -ln "Roughness_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Roughness" -ln "Roughness" -nn "Roughness multiplier" + -ct "HW_shader_parameter" -dv 0.20000000298023224 -min 0.0099999997764825821 -max + 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Name" -ln "OcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Type" -ln "OcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OcclusionTexture" -ln "OcclusionTexture" -nn "Ambient Occlusion Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OcclusionTextureR" -ln "OcclusionTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureG" -ln "OcclusionTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureB" -ln "OcclusionTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Name" -ln "OcclusionAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Type" -ln "OcclusionAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionAmount" -ln "OcclusionAmount" -nn "Occlusion Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Name" -ln "UseCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Type" -ln "UseCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseCavityTexture" -ln "UseCavityTexture" + -nn "Use Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "CavityTexture_Name" -ln "CavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityTexture_Type" -ln "CavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "CavityTexture" -ln "CavityTexture" -nn "Cavity Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "CavityTextureR" -ln "CavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureG" -ln "CavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureB" -ln "CavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -h true -sn "CavityAmount_Name" -ln "CavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityAmount_Type" -ln "CavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "CavityAmount" -ln "CavityAmount" -nn "Cavity Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Name" -ln "UseMicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Type" -ln "UseMicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroCavityTexture" -ln "UseMicroCavityTexture" + -nn "Use Micro Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Name" -ln "MicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Type" -ln "MicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroCavityTexture" -ln "MicroCavityTexture" + -nn "Micro Cavity Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroCavityTextureR" -ln "MicroCavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureG" -ln "MicroCavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureB" -ln "MicroCavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Name" -ln "MicroCavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Type" -ln "MicroCavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroCavityAmount" -ln "MicroCavityAmount" + -nn "Micro Cavity Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Name" -ln "UseMicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Type" -ln "UseMicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroNormalTexture" -ln "UseMicroNormalTexture" + -nn "Use Micro Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Name" -ln "MicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Type" -ln "MicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroNormalTexture" -ln "MicroNormalTexture" + -nn "Micro Normal Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroNormalTextureR" -ln "MicroNormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureG" -ln "MicroNormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureB" -ln "MicroNormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Name" -ln "MicroNormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Type" -ln "MicroNormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroNormalHeight" -ln "MicroNormalHeight" + -nn "Micro Normal Height" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 5 -at "float"; + addAttr -is true -ci true -h true -sn "MicroScale_Name" -ln "MicroScale_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "MicroScale_Type" -ln "MicroScale_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "MicroScale" -ln "MicroScale" -nn "Micro Scale" + -ct "HW_shader_parameter" -dv 32 -min 16 -max 99999 -smx 256 -at "float"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Name" -ln "UseBlendTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Type" -ln "UseBlendTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseBlendTexture" -ln "UseBlendTexture" -nn "Enable Wrinkle Mixing" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Name" -ln "OcclusionTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Type" -ln "OcclusionTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionTexcoord" -ln "OcclusionTexcoord" + -nn "Ambient Occlusion Map UV" -ct "HW_shader_parameter" -dv 1 -min 0 -max 2 -smn + 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -ci true -sn "Position" -ln "Position" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Position_Name" -ln "Position_Name" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -h true -sn "Position_Source" -ln "Position_Source" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -sn "Position_DefaultTexture" -ln "Position_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Position"; + addAttr -ci true -sn "TexCoord0" -ln "TexCoord0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord0_Name" -ln "TexCoord0_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -h true -sn "TexCoord0_Source" -ln "TexCoord0_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -sn "TexCoord0_DefaultTexture" -ln "TexCoord0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -ci true -sn "TexCoord1" -ln "TexCoord1" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord1_Name" -ln "TexCoord1_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -h true -sn "TexCoord1_Source" -ln "TexCoord1_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -sn "TexCoord1_DefaultTexture" -ln "TexCoord1_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -ci true -sn "TexCoord2" -ln "TexCoord2" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord2_Name" -ln "TexCoord2_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -h true -sn "TexCoord2_Source" -ln "TexCoord2_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -sn "TexCoord2_DefaultTexture" -ln "TexCoord2_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -ci true -sn "Normal" -ln "Normal" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Normal_Name" -ln "Normal_Name" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -h true -sn "Normal_Source" -ln "Normal_Source" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -sn "Normal_DefaultTexture" -ln "Normal_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Normal"; + addAttr -ci true -sn "Binormal0" -ln "Binormal0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Binormal0_Name" -ln "Binormal0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Binormal0"; + addAttr -is true -ci true -h true -sn "Binormal0_Source" -ln "Binormal0_Source" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -is true -ci true -sn "Binormal0_DefaultTexture" -ln "Binormal0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -ci true -sn "Tangent0" -ln "Tangent0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Tangent0_Name" -ln "Tangent0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -h true -sn "Tangent0_Source" -ln "Tangent0_Source" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -sn "Tangent0_DefaultTexture" -ln "Tangent0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Tangent0"; + setAttr ".vpar" -type "stringArray" 7 "Position" "TexCoord0" "TexCoord1" "TexCoord2" "Normal" "Binormal0" "Tangent0" ; + setAttr ".upar" -type "stringArray" 124 "SuperFilterTaps" "shadowMapTexelSize" "IsSwatchRender" "screenSize" "MayaFullScreenGamma" "light0Enable" "light0Type" "light0Pos" "light0Color" "light0Intensity" "light0Dir" "light0ConeAngle" "light0FallOff" "light0AttenScale" "light0ShadowOn" "light1Enable" "light1Type" "light1Pos" "light1Color" "light1Intensity" "light1Dir" "light1ConeAngle" "light1FallOff" "light1AttenScale" "light1ShadowOn" "light2Enable" "light2Type" "light2Pos" "light2Color" "light2Intensity" "light2Dir" "light2ConeAngle" "light2FallOff" "light2AttenScale" "light2ShadowOn" "LinearSpaceLighting" "UseShadows" "shadowMultiplier" "shadowDepthBias" "flipBackfaceNormals" "SkyRotation" "UseDiffuseIBLMap" "DiffuseIBLIntensity" "DiffuseCubeIBL" "UseSpecCubeIBL" "SpecularIBLIntensity" "SpecularCubeIBL" "transpDepthTexture" "opaqueDepthTexture" "UseDiffuseTexture" "UseDiffuseTextureAlpha" "DiffuseTexture" "DiffuseColor" "LutTexture" "DitherTexture" "skinCoeffX" "skinCoeffY" "skinCoeffZ" "NormalBlurring" "UseScatteringRadiusTexture" "ScatteringRadiusTexture" "skinScattering" "shadowBlur" "shadowDither" "shadowScattering" "shadowSaturation" "UseTranslucency" "BackScatteringThicknessTexture" "UseThicknessTexture" "skinScatteringRoughness" "skinScatteringOuterColor" "skinScatteringAmount" "skinAmbientScatteringAmount" "UseSpecularTextureAlpha" "UseSpecularTexture" "SpecularTexture" "SpecularColor" "LobeMix" "Roughness" "UseAmbientOcclusionTexture" "OcclusionTexture" "OcclusionAmount" "UseCavityTexture" "CavityTexture" "CavityAmount" "UseNormalTexture" "NormalTexture" "NormalHeight" "SupportNonUniformScale" "NormalCoordsysX" "NormalCoordsysY" "UseMicroCavityTexture" "MicroCavityTexture" "MicroCavityAmount" "UseMicroNormalTexture" "MicroNormalTexture" "MicroNormalHeight" "MicroScale" "OpacityMaskTexture" "Opacity" "UseOpacityMaskTexture" "OpacityMaskBias" "DisplacementModel" "UseDisplacementMap" "DisplacementTexture" "VectorDisplacementCoordSys" "DisplacementHeight" "DisplacementOffset" "DisplacementClippingBias" "BBoxExtraScale" "TessellationRange" "TessellationMin" "FlatTessellation" "UseBlendTexture" "DiffuseTexcoord" "OcclusionTexcoord" "OpacityMaskTexcoord" "SpecularTexcoord" "NormalTexcoord" "DisplacementTexcoord" "ThicknessTexcoord" "light0ShadowMap" "light1ShadowMap" "light2ShadowMap" ; + setAttr ".s" -type "string" "$PROJECT_ROOT/Common/SourceAssets/shaders/dx11_shd_eyeLeft.fx"; + setAttr ".t" -type "string" "TessellationOFF"; + setAttr ".SuperFilterTaps_Name" -type "string" "SuperFilterTaps"; + setAttr ".SuperFilterTaps_Type" -type "string" "float1x2"; + setAttr ".SuperFilterTaps" -type "float2" -0.84052002 -0.073954001 ; + setAttr ".shadowMapTexelSize_Name" -type "string" "shadowMapTexelSize"; + setAttr ".shadowMapTexelSize_Type" -type "string" "float"; + setAttr ".shadowMapTexelSize" 0.0019531298894435167; + setAttr ".LinearSpaceLighting_Name" -type "string" "LinearSpaceLighting"; + setAttr ".LinearSpaceLighting_Type" -type "string" "bool"; + setAttr -k on ".LinearSpaceLighting" yes; + setAttr ".UseShadows_Name" -type "string" "UseShadows"; + setAttr ".UseShadows_Type" -type "string" "bool"; + setAttr -k on ".UseShadows" yes; + setAttr ".shadowMultiplier_Name" -type "string" "shadowMultiplier"; + setAttr ".shadowMultiplier_Type" -type "string" "float"; + setAttr -k on ".shadowMultiplier" 1; + setAttr ".IsSwatchRender_Name" -type "string" "IsSwatchRender"; + setAttr ".IsSwatchRender_Type" -type "string" "bool"; + setAttr ".IsSwatchRender" no; + setAttr ".shadowDepthBias_Name" -type "string" "shadowDepthBias"; + setAttr ".shadowDepthBias_Type" -type "string" "float"; + setAttr -k on ".shadowDepthBias" 0.0099999997764825821; + setAttr ".MayaFullScreenGamma_Name" -type "string" "MayaFullScreenGamma"; + setAttr ".MayaFullScreenGamma_Type" -type "string" "bool"; + setAttr ".MayaFullScreenGamma" no; + setAttr ".flipBackfaceNormals_Name" -type "string" "flipBackfaceNormals"; + setAttr ".flipBackfaceNormals_Type" -type "string" "bool"; + setAttr -k on ".flipBackfaceNormals" yes; + setAttr ".light0Enable_Name" -type "string" "light0Enable"; + setAttr ".light0Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light0Enable" no; + setAttr ".light0Type_Name" -type "string" "light0Type"; + setAttr ".light0Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light0Type" 2; + setAttr ".light0Pos_Name" -type "string" "light0Pos"; + setAttr ".light0Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 100 1; + setAttr ".light0Color_Name" -type "string" "light0Color"; + setAttr ".light0Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light0Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light0Color"; + setAttr ".light0Intensity_Name" -type "string" "light0Intensity"; + setAttr ".light0Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light0Intensity" 1; + setAttr ".light0Dir_Name" -type "string" "light0Dir"; + setAttr ".light0Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light0ConeAngle_Name" -type "string" "light0ConeAngle"; + setAttr ".light0ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light0ConeAngle" 0.46000000834465027; + setAttr ".light0FallOff_Name" -type "string" "light0FallOff"; + setAttr ".light0FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light0FallOff" 0.69999998807907104; + setAttr ".light0AttenScale_Name" -type "string" "light0AttenScale"; + setAttr ".light0AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light0AttenScale" 0; + setAttr ".light0ShadowOn_Name" -type "string" "light0ShadowOn"; + setAttr ".light0ShadowOn_Type" -type "string" "bool"; + setAttr ".light0ShadowOn" yes; + setAttr ".light1Enable_Name" -type "string" "light1Enable"; + setAttr ".light1Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light1Enable" no; + setAttr ".light1Type_Name" -type "string" "light1Type"; + setAttr ".light1Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light1Type" 2; + setAttr ".light1Pos_Name" -type "string" "light1Pos"; + setAttr ".light1Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 -100 100 100 1; + setAttr ".light1Color_Name" -type "string" "light1Color"; + setAttr ".light1Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light1Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light1Color"; + setAttr ".light1Intensity_Name" -type "string" "light1Intensity"; + setAttr ".light1Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light1Intensity" 1; + setAttr ".light1Dir_Name" -type "string" "light1Dir"; + setAttr ".light1Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light1ConeAngle_Name" -type "string" "light1ConeAngle"; + setAttr ".light1ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light1ConeAngle" 45; + setAttr ".light1FallOff_Name" -type "string" "light1FallOff"; + setAttr ".light1FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light1FallOff" 0; + setAttr ".light1AttenScale_Name" -type "string" "light1AttenScale"; + setAttr ".light1AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light1AttenScale" 0; + setAttr ".light1ShadowOn_Name" -type "string" "light1ShadowOn"; + setAttr ".light1ShadowOn_Type" -type "string" "bool"; + setAttr ".light1ShadowOn" yes; + setAttr ".light2Enable_Name" -type "string" "light2Enable"; + setAttr ".light2Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light2Enable" no; + setAttr ".light2Type_Name" -type "string" "light2Type"; + setAttr ".light2Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light2Type" 2; + setAttr ".light2Pos_Name" -type "string" "light2Pos"; + setAttr ".light2Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 -100 1; + setAttr ".light2Color_Name" -type "string" "light2Color"; + setAttr ".light2Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light2Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light2Color"; + setAttr ".light2Intensity_Name" -type "string" "light2Intensity"; + setAttr ".light2Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light2Intensity" 1; + setAttr ".light2Dir_Name" -type "string" "light2Dir"; + setAttr ".light2Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light2ConeAngle_Name" -type "string" "light2ConeAngle"; + setAttr ".light2ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light2ConeAngle" 45; + setAttr ".light2FallOff_Name" -type "string" "light2FallOff"; + setAttr ".light2FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light2FallOff" 0; + setAttr ".light2AttenScale_Name" -type "string" "light2AttenScale"; + setAttr ".light2AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light2AttenScale" 0; + setAttr ".light2ShadowOn_Name" -type "string" "light2ShadowOn"; + setAttr ".light2ShadowOn_Type" -type "string" "bool"; + setAttr ".light2ShadowOn" yes; + setAttr ".UseAmbientOcclusionTexture_Name" -type "string" "UseAmbientOcclusionTexture"; + setAttr ".UseAmbientOcclusionTexture_Type" -type "string" "bool"; + setAttr -k on ".UseAmbientOcclusionTexture" no; + setAttr ".transpDepthTexture_Name" -type "string" "transpDepthTexture"; + setAttr ".transpDepthTexture_Type" -type "string" "texture"; + setAttr ".transpDepthTexture" -type "float3" 0 0 0 ; + setAttr ".opaqueDepthTexture_Name" -type "string" "opaqueDepthTexture"; + setAttr ".opaqueDepthTexture_Type" -type "string" "texture"; + setAttr ".opaqueDepthTexture" -type "float3" 0 0 0 ; + setAttr ".UseDiffuseTexture_Name" -type "string" "UseDiffuseTexture"; + setAttr ".UseDiffuseTexture_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTexture" yes; + setAttr ".UseDiffuseTextureAlpha_Name" -type "string" "UseDiffuseTextureAlpha"; + setAttr ".UseDiffuseTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTextureAlpha" no; + setAttr ".DiffuseTexture_Name" -type "string" "DiffuseTexture"; + setAttr ".DiffuseTexture_Type" -type "string" "texture"; + setAttr ".DiffuseTexture" -type "float3" 0 0 0 ; + setAttr ".DiffuseColor_Name" -type "string" "DiffuseColor"; + setAttr ".DiffuseColor_Type" -type "string" "color1x3"; + setAttr -k on ".DiffuseColor" -type "float3" 1 1 1 ; + setAttr ".Opacity_Name" -type "string" "Opacity"; + setAttr ".Opacity_Type" -type "string" "float"; + setAttr -k on ".Opacity" 1; + setAttr ".UseOpacityMaskTexture_Name" -type "string" "UseOpacityMaskTexture"; + setAttr ".UseOpacityMaskTexture_Type" -type "string" "bool"; + setAttr -k on ".UseOpacityMaskTexture" no; + setAttr ".OpacityMaskTexture_Name" -type "string" "OpacityMaskTexture"; + setAttr ".OpacityMaskTexture_Type" -type "string" "texture"; + setAttr ".OpacityMaskTexture" -type "float3" 0 0 0 ; + setAttr ".OpacityMaskBias_Name" -type "string" "OpacityMaskBias"; + setAttr ".OpacityMaskBias_Type" -type "string" "float"; + setAttr -k on ".OpacityMaskBias" 0.10000000149011612; + setAttr ".UseSpecularTexture_Name" -type "string" "UseSpecularTexture"; + setAttr ".UseSpecularTexture_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTexture" no; + setAttr ".SpecularTexture_Name" -type "string" "SpecularTexture"; + setAttr ".SpecularTexture_Type" -type "string" "texture"; + setAttr ".SpecularTexture" -type "float3" 0 0 0 ; + setAttr ".SpecularColor_Name" -type "string" "SpecularColor"; + setAttr ".SpecularColor_Type" -type "string" "color1x3"; + setAttr -k on ".SpecularColor" -type "float3" 1 1 1 ; + setAttr ".UseNormalTexture_Name" -type "string" "UseNormalTexture"; + setAttr ".UseNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseNormalTexture" yes; + setAttr ".NormalTexture_Name" -type "string" "NormalTexture"; + setAttr ".NormalTexture_Type" -type "string" "texture"; + setAttr ".NormalTexture" -type "float3" 0 0 0 ; + setAttr ".NormalHeight_Name" -type "string" "NormalHeight"; + setAttr ".NormalHeight_Type" -type "string" "float"; + setAttr -k on ".NormalHeight" 0.5; + setAttr ".SupportNonUniformScale_Name" -type "string" "SupportNonUniformScale"; + setAttr ".SupportNonUniformScale_Type" -type "string" "bool"; + setAttr -k on ".SupportNonUniformScale" yes; + setAttr ".NormalCoordsysX_Name" -type "string" "NormalCoordsysX"; + setAttr ".NormalCoordsysX_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysX" 0; + setAttr ".NormalCoordsysY_Name" -type "string" "NormalCoordsysY"; + setAttr ".NormalCoordsysY_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysY" 0; + setAttr ".DisplacementModel_Name" -type "string" "DisplacementModel"; + setAttr ".DisplacementModel_Type" -type "string" "enum"; + setAttr -k on ".DisplacementModel" 0; + setAttr ".UseDisplacementMap_Name" -type "string" "UseDisplacementMap"; + setAttr ".UseDisplacementMap_Type" -type "string" "bool"; + setAttr -k on ".UseDisplacementMap" no; + setAttr ".DisplacementTexture_Name" -type "string" "DisplacementTexture"; + setAttr ".DisplacementTexture_Type" -type "string" "texture"; + setAttr ".DisplacementTexture" -type "float3" 0 0 0 ; + setAttr ".VectorDisplacementCoordSys_Name" -type "string" "VectorDisplacementCoordSys"; + setAttr ".VectorDisplacementCoordSys_Type" -type "string" "enum"; + setAttr -k on ".VectorDisplacementCoordSys" 0; + setAttr ".DisplacementHeight_Name" -type "string" "DisplacementHeight"; + setAttr ".DisplacementHeight_Type" -type "string" "float"; + setAttr -k on ".DisplacementHeight" 0.5; + setAttr ".DisplacementOffset_Name" -type "string" "DisplacementOffset"; + setAttr ".DisplacementOffset_Type" -type "string" "float"; + setAttr -k on ".DisplacementOffset" 0.5; + setAttr ".DisplacementClippingBias_Name" -type "string" "DisplacementClippingBias"; + setAttr ".DisplacementClippingBias_Type" -type "string" "float"; + setAttr -k on ".DisplacementClippingBias" 5; + setAttr ".BBoxExtraScale_Name" -type "string" "BBoxExtraScale"; + setAttr ".BBoxExtraScale_Type" -type "string" "float"; + setAttr -k on ".BBoxExtraScale" 1; + setAttr ".TessellationRange_Name" -type "string" "TessellationRange"; + setAttr ".TessellationRange_Type" -type "string" "float"; + setAttr -k on ".TessellationRange" 0; + setAttr ".TessellationMin_Name" -type "string" "TessellationMin"; + setAttr ".TessellationMin_Type" -type "string" "float"; + setAttr -k on ".TessellationMin" 3; + setAttr ".FlatTessellation_Name" -type "string" "FlatTessellation"; + setAttr ".FlatTessellation_Type" -type "string" "float"; + setAttr -k on ".FlatTessellation" 0; + setAttr ".UseTranslucency_Name" -type "string" "UseTranslucency"; + setAttr ".UseTranslucency_Type" -type "string" "bool"; + setAttr -k on ".UseTranslucency" no; + setAttr ".UseThicknessTexture_Name" -type "string" "UseThicknessTexture"; + setAttr ".UseThicknessTexture_Type" -type "string" "bool"; + setAttr -k on ".UseThicknessTexture" no; + setAttr ".UseDiffuseIBLMap_Name" -type "string" "UseDiffuseIBLMap"; + setAttr ".UseDiffuseIBLMap_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseIBLMap" yes; + setAttr ".DiffuseIBLIntensity_Name" -type "string" "DiffuseIBLIntensity"; + setAttr ".DiffuseIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".DiffuseIBLIntensity" 0.65499997138977051; + setAttr ".DiffuseTexcoord_Name" -type "string" "DiffuseTexcoord"; + setAttr ".DiffuseTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DiffuseTexcoord" 0; + setAttr ".OpacityMaskTexcoord_Name" -type "string" "OpacityMaskTexcoord"; + setAttr ".OpacityMaskTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OpacityMaskTexcoord" 0; + setAttr ".SpecularTexcoord_Name" -type "string" "SpecularTexcoord"; + setAttr ".SpecularTexcoord_Type" -type "string" "enum"; + setAttr -k on ".SpecularTexcoord" 0; + setAttr ".NormalTexcoord_Name" -type "string" "NormalTexcoord"; + setAttr ".NormalTexcoord_Type" -type "string" "enum"; + setAttr -k on ".NormalTexcoord" 0; + setAttr ".DisplacementTexcoord_Name" -type "string" "DisplacementTexcoord"; + setAttr ".DisplacementTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DisplacementTexcoord" 0; + setAttr ".ThicknessTexcoord_Name" -type "string" "ThicknessTexcoord"; + setAttr ".ThicknessTexcoord_Type" -type "string" "enum"; + setAttr -k on ".ThicknessTexcoord" 0; + setAttr ".light0ShadowMap_Name" -type "string" "light0ShadowMap"; + setAttr ".light0ShadowMap_Type" -type "string" "texture"; + setAttr ".light0ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light1ShadowMap_Name" -type "string" "light1ShadowMap"; + setAttr ".light1ShadowMap_Type" -type "string" "texture"; + setAttr ".light1ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light2ShadowMap_Name" -type "string" "light2ShadowMap"; + setAttr ".light2ShadowMap_Type" -type "string" "texture"; + setAttr ".light2ShadowMap" -type "float3" 0 0 0 ; + setAttr ".screenSize_Name" -type "string" "screenSize"; + setAttr ".screenSize_Type" -type "string" "float1x2"; + setAttr ".screenSize" -type "float2" 0 0 ; + setAttr ".SkyRotation_Name" -type "string" "SkyRotation"; + setAttr ".SkyRotation_Type" -type "string" "float"; + setAttr -k on ".SkyRotation" 12.5; + setAttr ".DiffuseCubeIBL_Name" -type "string" "DiffuseCubeIBL"; + setAttr ".DiffuseCubeIBL_Type" -type "string" "texture"; + setAttr ".DiffuseCubeIBL" -type "float3" 0 0 0 ; + setAttr ".UseSpecCubeIBL_Name" -type "string" "UseSpecCubeIBL"; + setAttr ".UseSpecCubeIBL_Type" -type "string" "bool"; + setAttr -k on ".UseSpecCubeIBL" yes; + setAttr ".SpecularIBLIntensity_Name" -type "string" "SpecularIBLIntensity"; + setAttr ".SpecularIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".SpecularIBLIntensity" 0.020999999716877937; + setAttr ".SpecularCubeIBL_Name" -type "string" "SpecularCubeIBL"; + setAttr ".SpecularCubeIBL_Type" -type "string" "texture"; + setAttr ".SpecularCubeIBL" -type "float3" 0 0 0 ; + setAttr ".LutTexture_Name" -type "string" "LutTexture"; + setAttr ".LutTexture_Type" -type "string" "texture"; + setAttr ".LutTexture" -type "float3" 0 0 0 ; + setAttr ".DitherTexture_Name" -type "string" "DitherTexture"; + setAttr ".DitherTexture_Type" -type "string" "texture"; + setAttr ".DitherTexture" -type "float3" 0 0 0 ; + setAttr ".skinCoeffX_Name" -type "string" "skinCoeffX"; + setAttr ".skinCoeffX_Type" -type "string" "float"; + setAttr -k on ".skinCoeffX" 0.79500001668930054; + setAttr ".skinCoeffY_Name" -type "string" "skinCoeffY"; + setAttr ".skinCoeffY_Type" -type "string" "float"; + setAttr -k on ".skinCoeffY" 0.28799998760223389; + setAttr ".skinCoeffZ_Name" -type "string" "skinCoeffZ"; + setAttr ".skinCoeffZ_Type" -type "string" "float"; + setAttr -k on ".skinCoeffZ" 0.030999999493360519; + setAttr ".NormalBlurring_Name" -type "string" "NormalBlurring"; + setAttr ".NormalBlurring_Type" -type "string" "float"; + setAttr -k on ".NormalBlurring" 1; + setAttr ".ScatteringRadiusTexture_Name" -type "string" "ScatteringRadiusTexture"; + setAttr ".ScatteringRadiusTexture_Type" -type "string" "texture"; + setAttr ".ScatteringRadiusTexture" -type "float3" 0 0 0 ; + setAttr ".UseScatteringRadiusTexture_Name" -type "string" "UseScatteringRadiusTexture"; + setAttr ".UseScatteringRadiusTexture_Type" -type "string" "bool"; + setAttr -k on ".UseScatteringRadiusTexture" no; + setAttr ".skinScattering_Name" -type "string" "skinScattering"; + setAttr ".skinScattering_Type" -type "string" "float"; + setAttr -k on ".skinScattering" 0.43700000643730164; + setAttr ".shadowBlur_Name" -type "string" "shadowBlur"; + setAttr ".shadowBlur_Type" -type "string" "float"; + setAttr -k on ".shadowBlur" 1; + setAttr ".shadowDither_Name" -type "string" "shadowDither"; + setAttr ".shadowDither_Type" -type "string" "float"; + setAttr -k on ".shadowDither" 0.086999997496604919; + setAttr ".shadowScattering_Name" -type "string" "shadowScattering"; + setAttr ".shadowScattering_Type" -type "string" "float"; + setAttr -k on ".shadowScattering" 1; + setAttr ".shadowSaturation_Name" -type "string" "shadowSaturation"; + setAttr ".shadowSaturation_Type" -type "string" "float"; + setAttr -k on ".shadowSaturation" 1.2740000486373901; + setAttr ".BackScatteringThicknessTexture_Name" -type "string" "BackScatteringThicknessTexture"; + setAttr ".BackScatteringThicknessTexture_Type" -type "string" "texture"; + setAttr ".BackScatteringThicknessTexture" -type "float3" 0 0 0 ; + setAttr ".skinScatteringRoughness_Name" -type "string" "skinScatteringRoughness"; + setAttr ".skinScatteringRoughness_Type" -type "string" "float"; + setAttr -k on ".skinScatteringRoughness" 1; + setAttr ".skinScatteringOuterColor_Name" -type "string" "skinScatteringOuterColor"; + setAttr ".skinScatteringOuterColor_Type" -type "string" "color1x3"; + setAttr -k on ".skinScatteringOuterColor" -type "float3" 0.39607844 0.039215688 + 0 ; + setAttr ".skinScatteringAmount_Name" -type "string" "skinScatteringAmount"; + setAttr ".skinScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinScatteringAmount" 0.57599997520446777; + setAttr ".skinAmbientScatteringAmount_Name" -type "string" "skinAmbientScatteringAmount"; + setAttr ".skinAmbientScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinAmbientScatteringAmount" 2.1779999732971191; + setAttr ".UseSpecularTextureAlpha_Name" -type "string" "UseSpecularTextureAlpha"; + setAttr ".UseSpecularTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTextureAlpha" no; + setAttr ".LobeMix_Name" -type "string" "LobeMix"; + setAttr ".LobeMix_Type" -type "string" "float"; + setAttr -k on ".LobeMix" 0.77100002765655518; + setAttr ".Roughness_Name" -type "string" "Roughness"; + setAttr ".Roughness_Type" -type "string" "float"; + setAttr -k on ".Roughness" 0.31000000238418579; + setAttr ".OcclusionTexture_Name" -type "string" "OcclusionTexture"; + setAttr ".OcclusionTexture_Type" -type "string" "texture"; + setAttr ".OcclusionTexture" -type "float3" 0 0 0 ; + setAttr ".OcclusionAmount_Name" -type "string" "OcclusionAmount"; + setAttr ".OcclusionAmount_Type" -type "string" "float"; + setAttr -k on ".OcclusionAmount" 0.5; + setAttr ".UseCavityTexture_Name" -type "string" "UseCavityTexture"; + setAttr ".UseCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseCavityTexture" no; + setAttr ".CavityTexture_Name" -type "string" "CavityTexture"; + setAttr ".CavityTexture_Type" -type "string" "texture"; + setAttr ".CavityTexture" -type "float3" 0 0 0 ; + setAttr ".CavityAmount_Name" -type "string" "CavityAmount"; + setAttr ".CavityAmount_Type" -type "string" "float"; + setAttr -k on ".CavityAmount" 1; + setAttr ".UseMicroCavityTexture_Name" -type "string" "UseMicroCavityTexture"; + setAttr ".UseMicroCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroCavityTexture" no; + setAttr ".MicroCavityTexture_Name" -type "string" "MicroCavityTexture"; + setAttr ".MicroCavityTexture_Type" -type "string" "texture"; + setAttr ".MicroCavityTexture" -type "float3" 0 0 0 ; + setAttr ".MicroCavityAmount_Name" -type "string" "MicroCavityAmount"; + setAttr ".MicroCavityAmount_Type" -type "string" "float"; + setAttr -k on ".MicroCavityAmount" 1; + setAttr ".UseMicroNormalTexture_Name" -type "string" "UseMicroNormalTexture"; + setAttr ".UseMicroNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroNormalTexture" no; + setAttr ".MicroNormalTexture_Name" -type "string" "MicroNormalTexture"; + setAttr ".MicroNormalTexture_Type" -type "string" "texture"; + setAttr ".MicroNormalTexture" -type "float3" 0 0 0 ; + setAttr ".MicroNormalHeight_Name" -type "string" "MicroNormalHeight"; + setAttr ".MicroNormalHeight_Type" -type "string" "float"; + setAttr -k on ".MicroNormalHeight" 1; + setAttr ".MicroScale_Name" -type "string" "MicroScale"; + setAttr ".MicroScale_Type" -type "string" "float"; + setAttr -k on ".MicroScale" 32; + setAttr ".UseBlendTexture_Name" -type "string" "UseBlendTexture"; + setAttr ".UseBlendTexture_Type" -type "string" "bool"; + setAttr -k on ".UseBlendTexture" no; + setAttr ".OcclusionTexcoord_Name" -type "string" "OcclusionTexcoord"; + setAttr ".OcclusionTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OcclusionTexcoord" 1; + setAttr ".Position_Name" -type "string" "Position"; + setAttr ".Position_Source" -type "string" "position"; + setAttr ".TexCoord0_Name" -type "string" "TexCoord0"; + setAttr ".TexCoord0_Source" -type "string" "uv:map1"; + setAttr ".TexCoord0_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord1_Name" -type "string" "TexCoord1"; + setAttr ".TexCoord1_Source" -type "string" "uv:map2"; + setAttr ".TexCoord1_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord2_Name" -type "string" "TexCoord2"; + setAttr ".TexCoord2_Source" -type "string" "uv:map3"; + setAttr ".TexCoord2_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".Normal_Name" -type "string" "Normal"; + setAttr ".Normal_Source" -type "string" "normal"; + setAttr ".Binormal0_Name" -type "string" "Binormal0"; + setAttr ".Binormal0_Source" -type "string" "binormal:map1"; + setAttr ".Tangent0_Name" -type "string" "Tangent0"; + setAttr ".Tangent0_Source" -type "string" "tangent:map1"; +createNode shadingEngine -n "shader_eyeLeft_shaderSG"; + rename -uid "C17F754C-45B3-2D7A-7542-938BA5AA9017"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo4"; + rename -uid "86646D32-4A5C-56E1-D79F-6D9F200810B3"; +createNode dx11Shader -n "shader_eyeRight_shader"; + rename -uid "64831609-470E-C199-3F95-E78023FAB92B"; + addAttr -s false -is true -ci true -k true -sn "te" -ln "techniqueEnum" -nn "Technique" + -ct "HW_shader_parameter" -min 0 -max 2 -en "TessellationOFF" -at "enum"; + addAttr -ci true -sn "Light_0_use_implicit_lighting" -ln "Light_0_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_0_connected_light" -ln "Light_0_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_1_use_implicit_lighting" -ln "Light_1_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_1_connected_light" -ln "Light_1_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -ci true -sn "Light_2_use_implicit_lighting" -ln "Light_2_use_implicit_lighting" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -s false -ci true -sn "Light_2_connected_light" -ln "Light_2_connected_light" + -ct "HW_shader_parameter" -at "message"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Name" -ln "SuperFilterTaps_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps_Type" -ln "SuperFilterTaps_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SuperFilterTaps" -ln "SuperFilterTaps" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "SuperFilterTapsX" -ln "SuperFilterTapsX" -ct "HW_shader_parameter" + -dv -0.84052002429962158 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -sn "SuperFilterTapsY" -ln "SuperFilterTapsY" -ct "HW_shader_parameter" + -dv -0.073954001069068909 -smn 0 -smx 1 -at "float" -p "SuperFilterTaps"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Name" -ln "shadowMapTexelSize_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize_Type" -ln "shadowMapTexelSize_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMapTexelSize" -ln "shadowMapTexelSize" + -ct "HW_shader_parameter" -dv 0.0019531298894435167 -smn 0 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Name" -ln "LinearSpaceLighting_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "LinearSpaceLighting_Type" -ln "LinearSpaceLighting_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "LinearSpaceLighting" -ln "LinearSpaceLighting" + -nn "Linear Space Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseShadows_Name" -ln "UseShadows_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "UseShadows_Type" -ln "UseShadows_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "UseShadows" -ln "UseShadows" -nn "Shadows" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Name" -ln "shadowMultiplier_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowMultiplier_Type" -ln "shadowMultiplier_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowMultiplier" -ln "shadowMultiplier" + -nn "Shadow Strength" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Name" -ln "IsSwatchRender_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender_Type" -ln "IsSwatchRender_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "IsSwatchRender" -ln "IsSwatchRender" -ct "HW_shader_parameter" + -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Name" -ln "shadowDepthBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDepthBias_Type" -ln "shadowDepthBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDepthBias" -ln "shadowDepthBias" -nn "Shadow Bias" + -ct "HW_shader_parameter" -dv 0.0099999997764825821 -min 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Name" -ln "MayaFullScreenGamma_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma_Type" -ln "MayaFullScreenGamma_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MayaFullScreenGamma" -ln "MayaFullScreenGamma" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Name" -ln "flipBackfaceNormals_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "flipBackfaceNormals_Type" -ln "flipBackfaceNormals_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "flipBackfaceNormals" -ln "flipBackfaceNormals" + -nn "Double Sided Lighting" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Enable_Name" -ln "light0Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Enable_Type" -ln "light0Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Enable" -ln "light0Enable" -nn "Enable Light 0" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light0Type_Name" -ln "light0Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Type_Type" -ln "light0Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Type" -ln "light0Type" -nn "Light 0 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light0Pos_Name" -ln "light0Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Pos_Type" -ln "light0Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Pos" -ln "light0Pos" -nn "Light 0 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0Color_Name" -ln "light0Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Color_Type" -ln "light0Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light0Color" -ln "light0Color" -nn "Light 0 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ColorR" -ln "light0ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorG" -ln "light0ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -sn "light0ColorB" -ln "light0ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light0Color"; + addAttr -is true -ci true -h true -sn "light0Intensity_Name" -ln "light0Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0Intensity_Type" -ln "light0Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0Intensity" -ln "light0Intensity" -nn "Light 0 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0Dir_Name" -ln "light0Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light0Dir_Type" -ln "light0Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light0Dir" -ln "light0Dir" -nn "Light 0 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Name" -ln "light0ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ConeAngle_Type" -ln "light0ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0ConeAngle" -ln "light0ConeAngle" -nn "Light 0 Cone Angle" + -ct "HW_shader_parameter" -dv 0.46000000834465027 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0FallOff_Name" -ln "light0FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0FallOff_Type" -ln "light0FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0FallOff" -ln "light0FallOff" -nn "Light 0 Penumbra Angle" + -ct "HW_shader_parameter" -dv 0.69999998807907104 -min 0 -max 1.5707962512969971 + -at "float"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Name" -ln "light0AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0AttenScale_Type" -ln "light0AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light0AttenScale" -ln "light0AttenScale" + -nn "Light 0 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Name" -ln "light0ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn_Type" -ln "light0ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowOn" -ln "light0ShadowOn" -nn "Light 0 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Enable_Name" -ln "light1Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Enable_Type" -ln "light1Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Enable" -ln "light1Enable" -nn "Enable Light 1" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light1Type_Name" -ln "light1Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Type_Type" -ln "light1Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Type" -ln "light1Type" -nn "Light 1 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light1Pos_Name" -ln "light1Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Pos_Type" -ln "light1Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Pos" -ln "light1Pos" -nn "Light 1 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1Color_Name" -ln "light1Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Color_Type" -ln "light1Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light1Color" -ln "light1Color" -nn "Light 1 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ColorR" -ln "light1ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorG" -ln "light1ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -sn "light1ColorB" -ln "light1ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light1Color"; + addAttr -is true -ci true -h true -sn "light1Intensity_Name" -ln "light1Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1Intensity_Type" -ln "light1Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1Intensity" -ln "light1Intensity" -nn "Light 1 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1Dir_Name" -ln "light1Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light1Dir_Type" -ln "light1Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light1Dir" -ln "light1Dir" -nn "Light 1 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Name" -ln "light1ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ConeAngle_Type" -ln "light1ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1ConeAngle" -ln "light1ConeAngle" -nn "Light 1 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1FallOff_Name" -ln "light1FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1FallOff_Type" -ln "light1FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1FallOff" -ln "light1FallOff" -nn "Light 1 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Name" -ln "light1AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1AttenScale_Type" -ln "light1AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light1AttenScale" -ln "light1AttenScale" + -nn "Light 1 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Name" -ln "light1ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn_Type" -ln "light1ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowOn" -ln "light1ShadowOn" -nn "Light 1 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Enable_Name" -ln "light2Enable_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Enable_Type" -ln "light2Enable_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Enable" -ln "light2Enable" -nn "Enable Light 2" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "light2Type_Name" -ln "light2Type_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Type_Type" -ln "light2Type_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Type" -ln "light2Type" -nn "Light 2 Type" + -ct "HW_shader_parameter" -dv 2 -min 0 -max 5 -smn 0 -smx 1 -en "None:Default:Spot:Point:Directional:Ambient" + -at "enum"; + addAttr -is true -ci true -h true -sn "light2Pos_Name" -ln "light2Pos_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Pos_Type" -ln "light2Pos_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Pos" -ln "light2Pos" -nn "Light 2 Position" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2Color_Name" -ln "light2Color_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Color_Type" -ln "light2Color_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "light2Color" -ln "light2Color" -nn "Light 2 Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ColorR" -ln "light2ColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorG" -ln "light2ColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -sn "light2ColorB" -ln "light2ColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "light2Color"; + addAttr -is true -ci true -h true -sn "light2Intensity_Name" -ln "light2Intensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2Intensity_Type" -ln "light2Intensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2Intensity" -ln "light2Intensity" -nn "Light 2 Intensity" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2Dir_Name" -ln "light2Dir_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "light2Dir_Type" -ln "light2Dir_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "light2Dir" -ln "light2Dir" -nn "Light 2 Direction" + -ct "HW_shader_parameter" -at "matrix"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Name" -ln "light2ConeAngle_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ConeAngle_Type" -ln "light2ConeAngle_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2ConeAngle" -ln "light2ConeAngle" -nn "Light 2 Cone Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2FallOff_Name" -ln "light2FallOff_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2FallOff_Type" -ln "light2FallOff_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2FallOff" -ln "light2FallOff" -nn "Light 2 Penumbra Angle" + -ct "HW_shader_parameter" -min 0 -max 1.5707962512969971 -at "float"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Name" -ln "light2AttenScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2AttenScale_Type" -ln "light2AttenScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "light2AttenScale" -ln "light2AttenScale" + -nn "Light 2 Decay" -ct "HW_shader_parameter" -min 0 -max 99999 -at "float"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Name" -ln "light2ShadowOn_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn_Type" -ln "light2ShadowOn_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowOn" -ln "light2ShadowOn" -nn "Light 2 Casts Shadow" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Name" -ln "UseAmbientOcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseAmbientOcclusionTexture_Type" -ln "UseAmbientOcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseAmbientOcclusionTexture" -ln "UseAmbientOcclusionTexture" + -nn "Use Occlusion Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Name" -ln "transpDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "transpDepthTexture_Type" -ln "transpDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "transpDepthTexture" -ln "transpDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "transpDepthTextureR" -ln "transpDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureG" -ln "transpDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -sn "transpDepthTextureB" -ln "transpDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "transpDepthTexture"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Name" -ln "opaqueDepthTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "opaqueDepthTexture_Type" -ln "opaqueDepthTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "opaqueDepthTexture" -ln "opaqueDepthTexture" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "opaqueDepthTextureR" -ln "opaqueDepthTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureG" -ln "opaqueDepthTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -sn "opaqueDepthTextureB" -ln "opaqueDepthTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "opaqueDepthTexture"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Name" -ln "UseDiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTexture_Type" -ln "UseDiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTexture" -ln "UseDiffuseTexture" + -nn "Use Diffuse Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Name" -ln "UseDiffuseTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseTextureAlpha_Type" -ln "UseDiffuseTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseTextureAlpha" -ln "UseDiffuseTextureAlpha" + -nn "Use Diffuse Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Name" -ln "DiffuseTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexture_Type" -ln "DiffuseTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseTexture" -ln "DiffuseTexture" -nn "Diffuse Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseTextureR" -ln "DiffuseTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureG" -ln "DiffuseTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -sn "DiffuseTextureB" -ln "DiffuseTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseTexture"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Name" -ln "DiffuseColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseColor_Type" -ln "DiffuseColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "DiffuseColor" -ln "DiffuseColor" -nn "Diffuse Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseColorR" -ln "DiffuseColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorG" -ln "DiffuseColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -sn "DiffuseColorB" -ln "DiffuseColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "DiffuseColor"; + addAttr -is true -ci true -h true -sn "Opacity_Name" -ln "Opacity_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Opacity_Type" -ln "Opacity_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Opacity" -ln "Opacity" -nn "Opacity" -ct "HW_shader_parameter" + -dv 1 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Name" -ln "UseOpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseOpacityMaskTexture_Type" -ln "UseOpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseOpacityMaskTexture" -ln "UseOpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Name" -ln "OpacityMaskTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexture_Type" -ln "OpacityMaskTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OpacityMaskTexture" -ln "OpacityMaskTexture" + -nn "Opacity Mask" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OpacityMaskTextureR" -ln "OpacityMaskTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureG" -ln "OpacityMaskTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -sn "OpacityMaskTextureB" -ln "OpacityMaskTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OpacityMaskTexture"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Name" -ln "OpacityMaskBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskBias_Type" -ln "OpacityMaskBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskBias" -ln "OpacityMaskBias" -nn "Opacity Mask Bias" + -ct "HW_shader_parameter" -dv 0.10000000149011612 -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Name" -ln "UseSpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTexture_Type" -ln "UseSpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTexture" -ln "UseSpecularTexture" + -nn "Use Specular Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Name" -ln "SpecularTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexture_Type" -ln "SpecularTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularTexture" -ln "SpecularTexture" -nn "Specular Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularTextureR" -ln "SpecularTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureG" -ln "SpecularTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -sn "SpecularTextureB" -ln "SpecularTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularTexture"; + addAttr -is true -ci true -h true -sn "SpecularColor_Name" -ln "SpecularColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularColor_Type" -ln "SpecularColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "SpecularColor" -ln "SpecularColor" -nn "Specular Color" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularColorR" -ln "SpecularColorR" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorG" -ln "SpecularColorG" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -sn "SpecularColorB" -ln "SpecularColorB" -ct "HW_shader_parameter" + -dv 1 -smn 0 -smx 1 -at "float" -p "SpecularColor"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Name" -ln "UseNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseNormalTexture_Type" -ln "UseNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseNormalTexture" -ln "UseNormalTexture" + -nn "Use Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalTexture_Name" -ln "NormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexture_Type" -ln "NormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "NormalTexture" -ln "NormalTexture" -nn "Normal Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "NormalTextureR" -ln "NormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureG" -ln "NormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -sn "NormalTextureB" -ln "NormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "NormalTexture"; + addAttr -is true -ci true -h true -sn "NormalHeight_Name" -ln "NormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalHeight_Type" -ln "NormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalHeight" -ln "NormalHeight" -nn "Normal Height" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx 5 -at "float"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Name" -ln "SupportNonUniformScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SupportNonUniformScale_Type" -ln "SupportNonUniformScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SupportNonUniformScale" -ln "SupportNonUniformScale" + -nn "Support Non-Uniform Scale" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Name" -ln "NormalCoordsysX_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysX_Type" -ln "NormalCoordsysX_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysX" -ln "NormalCoordsysX" -nn "Normal X (Red)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Name" -ln "NormalCoordsysY_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalCoordsysY_Type" -ln "NormalCoordsysY_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalCoordsysY" -ln "NormalCoordsysY" -nn "Normal Y (Green)" + -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en "Positive:Negative" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Name" -ln "DisplacementModel_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementModel_Type" -ln "DisplacementModel_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementModel" -ln "DisplacementModel" + -nn "Displacement Model" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 -en + "Grayscale:Tangent Vector" -at "enum"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Name" -ln "UseDisplacementMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDisplacementMap_Type" -ln "UseDisplacementMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDisplacementMap" -ln "UseDisplacementMap" + -nn "Displacement Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Name" -ln "DisplacementTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexture_Type" -ln "DisplacementTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DisplacementTexture" -ln "DisplacementTexture" + -nn "Displacement Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DisplacementTextureR" -ln "DisplacementTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureG" -ln "DisplacementTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -sn "DisplacementTextureB" -ln "DisplacementTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "DisplacementTexture"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Name" -ln "VectorDisplacementCoordSys_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "VectorDisplacementCoordSys_Type" -ln "VectorDisplacementCoordSys_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "VectorDisplacementCoordSys" -ln "VectorDisplacementCoordSys" + -nn "Displacement Coordsys" -ct "HW_shader_parameter" -min 0 -max 1 -smn 0 -smx 1 + -en "Mudbox (XZY):Maya (XYZ)" -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Name" -ln "DisplacementHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementHeight_Type" -ln "DisplacementHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementHeight" -ln "DisplacementHeight" + -nn "Displacement Height" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn 0 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Name" -ln "DisplacementOffset_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementOffset_Type" -ln "DisplacementOffset_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementOffset" -ln "DisplacementOffset" + -nn "Displacement Offset" -ct "HW_shader_parameter" -dv 0.5 -min -99999 -max 99999 + -smn -1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Name" -ln "DisplacementClippingBias_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementClippingBias_Type" -ln "DisplacementClippingBias_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementClippingBias" -ln "DisplacementClippingBias" + -nn "Displacement Clipping Bias" -ct "HW_shader_parameter" -dv 5 -min -99999 -max + 99999 -smn 0 -smx 99 -at "float"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Name" -ln "BBoxExtraScale_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BBoxExtraScale_Type" -ln "BBoxExtraScale_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "BBoxExtraScale" -ln "BBoxExtraScale" -nn "Bounding Box Extra Scale" + -ct "HW_shader_parameter" -dv 1 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationRange_Name" -ln "TessellationRange_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationRange_Type" -ln "TessellationRange_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationRange" -ln "TessellationRange" + -nn "Tessellation Range" -ct "HW_shader_parameter" -min 0 -max 99999 -smx 999 -at "float"; + addAttr -is true -ci true -h true -sn "TessellationMin_Name" -ln "TessellationMin_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "TessellationMin_Type" -ln "TessellationMin_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "TessellationMin" -ln "TessellationMin" -nn "Tessellation Minimum" + -ct "HW_shader_parameter" -dv 3 -min 1 -max 99999 -smx 10 -at "float"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Name" -ln "FlatTessellation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "FlatTessellation_Type" -ln "FlatTessellation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "FlatTessellation" -ln "FlatTessellation" + -nn "Flat Tessellation" -ct "HW_shader_parameter" -min 0 -max 1 -at "float"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Name" -ln "UseTranslucency_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseTranslucency_Type" -ln "UseTranslucency_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseTranslucency" -ln "UseTranslucency" -nn "Back Scattering" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Name" -ln "UseThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseThicknessTexture_Type" -ln "UseThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseThicknessTexture" -ln "UseThicknessTexture" + -nn "Use Thickness Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Name" -ln "UseDiffuseIBLMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseDiffuseIBLMap_Type" -ln "UseDiffuseIBLMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseDiffuseIBLMap" -ln "UseDiffuseIBLMap" + -nn "Use Diffuse Cubemap" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Name" -ln "DiffuseIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseIBLIntensity_Type" -ln "DiffuseIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseIBLIntensity" -ln "DiffuseIBLIntensity" + -nn "Diffuse IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Name" -ln "DiffuseTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseTexcoord_Type" -ln "DiffuseTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DiffuseTexcoord" -ln "DiffuseTexcoord" -nn "Diffuse Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Name" -ln "OpacityMaskTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OpacityMaskTexcoord_Type" -ln "OpacityMaskTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OpacityMaskTexcoord" -ln "OpacityMaskTexcoord" + -nn "Opacity Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Name" -ln "SpecularTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularTexcoord_Type" -ln "SpecularTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularTexcoord" -ln "SpecularTexcoord" + -nn "Specular Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Name" -ln "NormalTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalTexcoord_Type" -ln "NormalTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalTexcoord" -ln "NormalTexcoord" -nn "Normal Map UV" + -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" + -at "enum"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Name" -ln "DisplacementTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DisplacementTexcoord_Type" -ln "DisplacementTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "DisplacementTexcoord" -ln "DisplacementTexcoord" + -nn "Displacement Map UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 -en + "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Name" -ln "ThicknessTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ThicknessTexcoord_Type" -ln "ThicknessTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "ThicknessTexcoord" -ln "ThicknessTexcoord" + -nn "Translucency Mask UV" -ct "HW_shader_parameter" -min 0 -max 2 -smn 0 -smx 1 + -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Name" -ln "light0ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light0ShadowMap_Type" -ln "light0ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light0ShadowMap" -ln "light0ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light0ShadowMapR" -ln "light0ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapG" -ln "light0ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -sn "light0ShadowMapB" -ln "light0ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light0ShadowMap"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Name" -ln "light1ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light1ShadowMap_Type" -ln "light1ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light1ShadowMap" -ln "light1ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light1ShadowMapR" -ln "light1ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapG" -ln "light1ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -sn "light1ShadowMapB" -ln "light1ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light1ShadowMap"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Name" -ln "light2ShadowMap_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "light2ShadowMap_Type" -ln "light2ShadowMap_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -h true -sn "light2ShadowMap" -ln "light2ShadowMap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "light2ShadowMapR" -ln "light2ShadowMapR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapG" -ln "light2ShadowMapG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -sn "light2ShadowMapB" -ln "light2ShadowMapB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "light2ShadowMap"; + addAttr -is true -ci true -h true -sn "screenSize_Name" -ln "screenSize_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize_Type" -ln "screenSize_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "screenSize" -ln "screenSize" -ct "HW_shader_parameter" + -at "float2" -nc 2; + addAttr -is true -ci true -sn "screenSizeX" -ln "screenSizeX" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -sn "screenSizeY" -ln "screenSizeY" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "screenSize"; + addAttr -is true -ci true -h true -sn "SkyRotation_Name" -ln "SkyRotation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SkyRotation_Type" -ln "SkyRotation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SkyRotation" -ln "SkyRotation" -nn "Sky Rotation" + -ct "HW_shader_parameter" -min 0 -max 99999 -smn 0 -smx 360 -at "float"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Name" -ln "DiffuseCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DiffuseCubeIBL_Type" -ln "DiffuseCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DiffuseCubeIBL" -ln "DiffuseCubeIBL" -nn "Diffuse Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DiffuseCubeIBLR" -ln "DiffuseCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLG" -ln "DiffuseCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -sn "DiffuseCubeIBLB" -ln "DiffuseCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DiffuseCubeIBL"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Name" -ln "UseSpecCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecCubeIBL_Type" -ln "UseSpecCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecCubeIBL" -ln "UseSpecCubeIBL" -nn "Use Specular Cubemap" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Name" -ln "SpecularIBLIntensity_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularIBLIntensity_Type" -ln "SpecularIBLIntensity_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "SpecularIBLIntensity" -ln "SpecularIBLIntensity" + -nn "Specular IBL Intensity" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Name" -ln "SpecularCubeIBL_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "SpecularCubeIBL_Type" -ln "SpecularCubeIBL_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "SpecularCubeIBL" -ln "SpecularCubeIBL" -nn "Specular Cubemap" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "SpecularCubeIBLR" -ln "SpecularCubeIBLR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLG" -ln "SpecularCubeIBLG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -sn "SpecularCubeIBLB" -ln "SpecularCubeIBLB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "SpecularCubeIBL"; + addAttr -is true -ci true -h true -sn "LutTexture_Name" -ln "LutTexture_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LutTexture_Type" -ln "LutTexture_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -uac -sn "LutTexture" -ln "LutTexture" -nn "SSS LUT Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "LutTextureR" -ln "LutTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureG" -ln "LutTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -sn "LutTextureB" -ln "LutTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "LutTexture"; + addAttr -is true -ci true -h true -sn "DitherTexture_Name" -ln "DitherTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "DitherTexture_Type" -ln "DitherTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "DitherTexture" -ln "DitherTexture" -nn "SSS Dither Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "DitherTextureR" -ln "DitherTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureG" -ln "DitherTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -sn "DitherTextureB" -ln "DitherTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "DitherTexture"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Name" -ln "skinCoeffX_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffX_Type" -ln "skinCoeffX_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffX" -ln "skinCoeffX" -nn "SSS Coeffient R" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Name" -ln "skinCoeffY_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffY_Type" -ln "skinCoeffY_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffY" -ln "skinCoeffY" -nn "SSS Coeffient G" + -ct "HW_shader_parameter" -dv 0.5 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Name" -ln "skinCoeffZ_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "skinCoeffZ_Type" -ln "skinCoeffZ_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "skinCoeffZ" -ln "skinCoeffZ" -nn "SSS Coeffient B" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Name" -ln "NormalBlurring_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "NormalBlurring_Type" -ln "NormalBlurring_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "NormalBlurring" -ln "NormalBlurring" -nn "SSS Softness" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Name" -ln "ScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "ScatteringRadiusTexture_Type" -ln "ScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "ScatteringRadiusTexture" -ln "ScatteringRadiusTexture" + -nn "SSS Radius Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "ScatteringRadiusTextureR" -ln "ScatteringRadiusTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureG" -ln "ScatteringRadiusTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -sn "ScatteringRadiusTextureB" -ln "ScatteringRadiusTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "ScatteringRadiusTexture"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Name" -ln "UseScatteringRadiusTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseScatteringRadiusTexture_Type" -ln "UseScatteringRadiusTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseScatteringRadiusTexture" -ln "UseScatteringRadiusTexture" + -nn "Use SSS Radius Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "skinScattering_Name" -ln "skinScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScattering_Type" -ln "skinScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScattering" -ln "skinScattering" -nn "SSS Radius" + -ct "HW_shader_parameter" -dv 0.25 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowBlur_Name" -ln "shadowBlur_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "shadowBlur_Type" -ln "shadowBlur_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "shadowBlur" -ln "shadowBlur" -nn "SSS Shadow Blur" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowDither_Name" -ln "shadowDither_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowDither_Type" -ln "shadowDither_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowDither" -ln "shadowDither" -nn "SSS Shadow Dither" + -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "shadowScattering_Name" -ln "shadowScattering_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowScattering_Type" -ln "shadowScattering_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowScattering" -ln "shadowScattering" + -nn "SSS Shadow Scattering" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Name" -ln "shadowSaturation_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "shadowSaturation_Type" -ln "shadowSaturation_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "shadowSaturation" -ln "shadowSaturation" + -nn "SSS Shadow Saturation" -ct "HW_shader_parameter" -dv 1 -min 0 -max 4 -smx 4 + -at "float"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Name" -ln "BackScatteringThicknessTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "BackScatteringThicknessTexture_Type" -ln "BackScatteringThicknessTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "BackScatteringThicknessTexture" -ln "BackScatteringThicknessTexture" + -nn "Thickness Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureR" -ln "BackScatteringThicknessTextureR" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureG" -ln "BackScatteringThicknessTextureG" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -sn "BackScatteringThicknessTextureB" -ln "BackScatteringThicknessTextureB" + -ct "HW_shader_parameter" -smn 0 -smx 1 -at "float" -p "BackScatteringThicknessTexture"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Name" -ln "skinScatteringRoughness_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringRoughness_Type" -ln "skinScatteringRoughness_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringRoughness" -ln "skinScatteringRoughness" + -nn "Back Scattering Width" -ct "HW_shader_parameter" -dv 1 -min 0 -max 1 -smx 1 + -at "float"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Name" -ln "skinScatteringOuterColor_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringOuterColor_Type" -ln "skinScatteringOuterColor_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -k true -sn "skinScatteringOuterColor" -ln "skinScatteringOuterColor" + -nn "Back Scattering Color" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "skinScatteringOuterColorR" -ln "skinScatteringOuterColorR" + -ct "HW_shader_parameter" -dv 0.25 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorG" -ln "skinScatteringOuterColorG" + -ct "HW_shader_parameter" -dv 0.05000000074505806 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -sn "skinScatteringOuterColorB" -ln "skinScatteringOuterColorB" + -ct "HW_shader_parameter" -dv 0.019999999552965164 -smn 0 -smx 1 -at "float" -p "skinScatteringOuterColor"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Name" -ln "skinScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinScatteringAmount_Type" -ln "skinScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinScatteringAmount" -ln "skinScatteringAmount" + -nn "Back Scattering Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 6 -smx 6 + -at "float"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Name" -ln "skinAmbientScatteringAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "skinAmbientScatteringAmount_Type" -ln "skinAmbientScatteringAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "skinAmbientScatteringAmount" -ln "skinAmbientScatteringAmount" + -nn "Back Scattering Ambient Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max + 6 -smx 6 -at "float"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Name" -ln "UseSpecularTextureAlpha_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseSpecularTextureAlpha_Type" -ln "UseSpecularTextureAlpha_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseSpecularTextureAlpha" -ln "UseSpecularTextureAlpha" + -nn "Use Roughness Map Alpha" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "LobeMix_Name" -ln "LobeMix_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "LobeMix_Type" -ln "LobeMix_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "LobeMix" -ln "LobeMix" -nn "Lobe Mixing" + -ct "HW_shader_parameter" -dv 0.75 -min 0 -max 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "Roughness_Name" -ln "Roughness_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "Roughness_Type" -ln "Roughness_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "Roughness" -ln "Roughness" -nn "Roughness multiplier" + -ct "HW_shader_parameter" -dv 0.20000000298023224 -min 0.0099999997764825821 -max + 1 -smx 1 -at "float"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Name" -ln "OcclusionTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexture_Type" -ln "OcclusionTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "OcclusionTexture" -ln "OcclusionTexture" -nn "Ambient Occlusion Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "OcclusionTextureR" -ln "OcclusionTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureG" -ln "OcclusionTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -sn "OcclusionTextureB" -ln "OcclusionTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "OcclusionTexture"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Name" -ln "OcclusionAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionAmount_Type" -ln "OcclusionAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionAmount" -ln "OcclusionAmount" -nn "Occlusion Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Name" -ln "UseCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseCavityTexture_Type" -ln "UseCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseCavityTexture" -ln "UseCavityTexture" + -nn "Use Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "CavityTexture_Name" -ln "CavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityTexture_Type" -ln "CavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "CavityTexture" -ln "CavityTexture" -nn "Cavity Map" + -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "CavityTextureR" -ln "CavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureG" -ln "CavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -sn "CavityTextureB" -ln "CavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "CavityTexture"; + addAttr -is true -ci true -h true -sn "CavityAmount_Name" -ln "CavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "CavityAmount_Type" -ln "CavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "CavityAmount" -ln "CavityAmount" -nn "Cavity Amount" + -ct "HW_shader_parameter" -dv 1 -min 0.0099999997764825821 -max 2 -smx 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Name" -ln "UseMicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroCavityTexture_Type" -ln "UseMicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroCavityTexture" -ln "UseMicroCavityTexture" + -nn "Use Micro Cavity Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Name" -ln "MicroCavityTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityTexture_Type" -ln "MicroCavityTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroCavityTexture" -ln "MicroCavityTexture" + -nn "Micro Cavity Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroCavityTextureR" -ln "MicroCavityTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureG" -ln "MicroCavityTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -sn "MicroCavityTextureB" -ln "MicroCavityTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroCavityTexture"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Name" -ln "MicroCavityAmount_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroCavityAmount_Type" -ln "MicroCavityAmount_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroCavityAmount" -ln "MicroCavityAmount" + -nn "Micro Cavity Amount" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 2 -at "float"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Name" -ln "UseMicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseMicroNormalTexture_Type" -ln "UseMicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseMicroNormalTexture" -ln "UseMicroNormalTexture" + -nn "Use Micro Normal Map" -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Name" -ln "MicroNormalTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalTexture_Type" -ln "MicroNormalTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -uac -sn "MicroNormalTexture" -ln "MicroNormalTexture" + -nn "Micro Normal Map" -ct "HW_shader_parameter" -at "float3" -nc 3; + addAttr -is true -ci true -sn "MicroNormalTextureR" -ln "MicroNormalTextureR" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureG" -ln "MicroNormalTextureG" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -sn "MicroNormalTextureB" -ln "MicroNormalTextureB" -ct "HW_shader_parameter" + -smn 0 -smx 1 -at "float" -p "MicroNormalTexture"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Name" -ln "MicroNormalHeight_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "MicroNormalHeight_Type" -ln "MicroNormalHeight_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "MicroNormalHeight" -ln "MicroNormalHeight" + -nn "Micro Normal Height" -ct "HW_shader_parameter" -dv 1 -min 0 -max 99999 -smx + 5 -at "float"; + addAttr -is true -ci true -h true -sn "MicroScale_Name" -ln "MicroScale_Name" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -h true -sn "MicroScale_Type" -ln "MicroScale_Type" -ct "HW_shader_parameter" + -dt "string"; + addAttr -is true -ci true -k true -sn "MicroScale" -ln "MicroScale" -nn "Micro Scale" + -ct "HW_shader_parameter" -dv 32 -min 16 -max 99999 -smx 256 -at "float"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Name" -ln "UseBlendTexture_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "UseBlendTexture_Type" -ln "UseBlendTexture_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "UseBlendTexture" -ln "UseBlendTexture" -nn "Enable Wrinkle Mixing" + -ct "HW_shader_parameter" -min 0 -max 1 -at "bool"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Name" -ln "OcclusionTexcoord_Name" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -h true -sn "OcclusionTexcoord_Type" -ln "OcclusionTexcoord_Type" + -ct "HW_shader_parameter" -dt "string"; + addAttr -is true -ci true -k true -sn "OcclusionTexcoord" -ln "OcclusionTexcoord" + -nn "Ambient Occlusion Map UV" -ct "HW_shader_parameter" -dv 1 -min 0 -max 2 -smn + 0 -smx 1 -en "TexCoord0:TexCoord1:TexCoord2" -at "enum"; + addAttr -ci true -sn "Position" -ln "Position" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Position_Name" -ln "Position_Name" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -h true -sn "Position_Source" -ln "Position_Source" -ct "HW_shader_parameter" + -dt "string" -p "Position"; + addAttr -is true -ci true -sn "Position_DefaultTexture" -ln "Position_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Position"; + addAttr -ci true -sn "TexCoord0" -ln "TexCoord0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord0_Name" -ln "TexCoord0_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -h true -sn "TexCoord0_Source" -ln "TexCoord0_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -is true -ci true -sn "TexCoord0_DefaultTexture" -ln "TexCoord0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord0"; + addAttr -ci true -sn "TexCoord1" -ln "TexCoord1" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord1_Name" -ln "TexCoord1_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -h true -sn "TexCoord1_Source" -ln "TexCoord1_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -is true -ci true -sn "TexCoord1_DefaultTexture" -ln "TexCoord1_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord1"; + addAttr -ci true -sn "TexCoord2" -ln "TexCoord2" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "TexCoord2_Name" -ln "TexCoord2_Name" -ct "HW_shader_parameter" + -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -h true -sn "TexCoord2_Source" -ln "TexCoord2_Source" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -is true -ci true -sn "TexCoord2_DefaultTexture" -ln "TexCoord2_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "TexCoord2"; + addAttr -ci true -sn "Normal" -ln "Normal" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Normal_Name" -ln "Normal_Name" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -h true -sn "Normal_Source" -ln "Normal_Source" -ct "HW_shader_parameter" + -dt "string" -p "Normal"; + addAttr -is true -ci true -sn "Normal_DefaultTexture" -ln "Normal_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Normal"; + addAttr -ci true -sn "Binormal0" -ln "Binormal0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Binormal0_Name" -ln "Binormal0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Binormal0"; + addAttr -is true -ci true -h true -sn "Binormal0_Source" -ln "Binormal0_Source" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -is true -ci true -sn "Binormal0_DefaultTexture" -ln "Binormal0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Binormal0"; + addAttr -ci true -sn "Tangent0" -ln "Tangent0" -at "compound" -nc 3; + addAttr -is true -ci true -h true -sn "Tangent0_Name" -ln "Tangent0_Name" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -h true -sn "Tangent0_Source" -ln "Tangent0_Source" -ct "HW_shader_parameter" + -dt "string" -p "Tangent0"; + addAttr -is true -ci true -sn "Tangent0_DefaultTexture" -ln "Tangent0_DefaultTexture" + -ct "HW_shader_parameter" -dt "string" -p "Tangent0"; + setAttr ".vpar" -type "stringArray" 7 "Position" "TexCoord0" "TexCoord1" "TexCoord2" "Normal" "Binormal0" "Tangent0" ; + setAttr ".upar" -type "stringArray" 124 "SuperFilterTaps" "shadowMapTexelSize" "IsSwatchRender" "screenSize" "MayaFullScreenGamma" "light0Enable" "light0Type" "light0Pos" "light0Color" "light0Intensity" "light0Dir" "light0ConeAngle" "light0FallOff" "light0AttenScale" "light0ShadowOn" "light1Enable" "light1Type" "light1Pos" "light1Color" "light1Intensity" "light1Dir" "light1ConeAngle" "light1FallOff" "light1AttenScale" "light1ShadowOn" "light2Enable" "light2Type" "light2Pos" "light2Color" "light2Intensity" "light2Dir" "light2ConeAngle" "light2FallOff" "light2AttenScale" "light2ShadowOn" "LinearSpaceLighting" "UseShadows" "shadowMultiplier" "shadowDepthBias" "flipBackfaceNormals" "SkyRotation" "UseDiffuseIBLMap" "DiffuseIBLIntensity" "DiffuseCubeIBL" "UseSpecCubeIBL" "SpecularIBLIntensity" "SpecularCubeIBL" "transpDepthTexture" "opaqueDepthTexture" "UseDiffuseTexture" "UseDiffuseTextureAlpha" "DiffuseTexture" "DiffuseColor" "LutTexture" "DitherTexture" "skinCoeffX" "skinCoeffY" "skinCoeffZ" "NormalBlurring" "UseScatteringRadiusTexture" "ScatteringRadiusTexture" "skinScattering" "shadowBlur" "shadowDither" "shadowScattering" "shadowSaturation" "UseTranslucency" "BackScatteringThicknessTexture" "UseThicknessTexture" "skinScatteringRoughness" "skinScatteringOuterColor" "skinScatteringAmount" "skinAmbientScatteringAmount" "UseSpecularTextureAlpha" "UseSpecularTexture" "SpecularTexture" "SpecularColor" "LobeMix" "Roughness" "UseAmbientOcclusionTexture" "OcclusionTexture" "OcclusionAmount" "UseCavityTexture" "CavityTexture" "CavityAmount" "UseNormalTexture" "NormalTexture" "NormalHeight" "SupportNonUniformScale" "NormalCoordsysX" "NormalCoordsysY" "UseMicroCavityTexture" "MicroCavityTexture" "MicroCavityAmount" "UseMicroNormalTexture" "MicroNormalTexture" "MicroNormalHeight" "MicroScale" "OpacityMaskTexture" "Opacity" "UseOpacityMaskTexture" "OpacityMaskBias" "DisplacementModel" "UseDisplacementMap" "DisplacementTexture" "VectorDisplacementCoordSys" "DisplacementHeight" "DisplacementOffset" "DisplacementClippingBias" "BBoxExtraScale" "TessellationRange" "TessellationMin" "FlatTessellation" "UseBlendTexture" "DiffuseTexcoord" "OcclusionTexcoord" "OpacityMaskTexcoord" "SpecularTexcoord" "NormalTexcoord" "DisplacementTexcoord" "ThicknessTexcoord" "light0ShadowMap" "light1ShadowMap" "light2ShadowMap" ; + setAttr ".s" -type "string" "$PROJECT_ROOT/Common/SourceAssets/shaders/dx11_shd_eyeRight.fx"; + setAttr ".t" -type "string" "TessellationOFF"; + setAttr ".SuperFilterTaps_Name" -type "string" "SuperFilterTaps"; + setAttr ".SuperFilterTaps_Type" -type "string" "float1x2"; + setAttr ".SuperFilterTaps" -type "float2" -0.84052002 -0.073954001 ; + setAttr ".shadowMapTexelSize_Name" -type "string" "shadowMapTexelSize"; + setAttr ".shadowMapTexelSize_Type" -type "string" "float"; + setAttr ".shadowMapTexelSize" 0.0019531298894435167; + setAttr ".LinearSpaceLighting_Name" -type "string" "LinearSpaceLighting"; + setAttr ".LinearSpaceLighting_Type" -type "string" "bool"; + setAttr -k on ".LinearSpaceLighting" yes; + setAttr ".UseShadows_Name" -type "string" "UseShadows"; + setAttr ".UseShadows_Type" -type "string" "bool"; + setAttr -k on ".UseShadows" yes; + setAttr ".shadowMultiplier_Name" -type "string" "shadowMultiplier"; + setAttr ".shadowMultiplier_Type" -type "string" "float"; + setAttr -k on ".shadowMultiplier" 1; + setAttr ".IsSwatchRender_Name" -type "string" "IsSwatchRender"; + setAttr ".IsSwatchRender_Type" -type "string" "bool"; + setAttr ".IsSwatchRender" no; + setAttr ".shadowDepthBias_Name" -type "string" "shadowDepthBias"; + setAttr ".shadowDepthBias_Type" -type "string" "float"; + setAttr -k on ".shadowDepthBias" 0.0099999997764825821; + setAttr ".MayaFullScreenGamma_Name" -type "string" "MayaFullScreenGamma"; + setAttr ".MayaFullScreenGamma_Type" -type "string" "bool"; + setAttr ".MayaFullScreenGamma" no; + setAttr ".flipBackfaceNormals_Name" -type "string" "flipBackfaceNormals"; + setAttr ".flipBackfaceNormals_Type" -type "string" "bool"; + setAttr -k on ".flipBackfaceNormals" yes; + setAttr ".light0Enable_Name" -type "string" "light0Enable"; + setAttr ".light0Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light0Enable" no; + setAttr ".light0Type_Name" -type "string" "light0Type"; + setAttr ".light0Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light0Type" 2; + setAttr ".light0Pos_Name" -type "string" "light0Pos"; + setAttr ".light0Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 100 1; + setAttr ".light0Color_Name" -type "string" "light0Color"; + setAttr ".light0Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light0Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light0Color"; + setAttr ".light0Intensity_Name" -type "string" "light0Intensity"; + setAttr ".light0Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light0Intensity" 1; + setAttr ".light0Dir_Name" -type "string" "light0Dir"; + setAttr ".light0Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light0Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light0ConeAngle_Name" -type "string" "light0ConeAngle"; + setAttr ".light0ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light0ConeAngle" 0.46000000834465027; + setAttr ".light0FallOff_Name" -type "string" "light0FallOff"; + setAttr ".light0FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light0FallOff" 0.69999998807907104; + setAttr ".light0AttenScale_Name" -type "string" "light0AttenScale"; + setAttr ".light0AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light0AttenScale" 0; + setAttr ".light0ShadowOn_Name" -type "string" "light0ShadowOn"; + setAttr ".light0ShadowOn_Type" -type "string" "bool"; + setAttr ".light0ShadowOn" yes; + setAttr ".light1Enable_Name" -type "string" "light1Enable"; + setAttr ".light1Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light1Enable" no; + setAttr ".light1Type_Name" -type "string" "light1Type"; + setAttr ".light1Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light1Type" 2; + setAttr ".light1Pos_Name" -type "string" "light1Pos"; + setAttr ".light1Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 -100 100 100 1; + setAttr ".light1Color_Name" -type "string" "light1Color"; + setAttr ".light1Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light1Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light1Color"; + setAttr ".light1Intensity_Name" -type "string" "light1Intensity"; + setAttr ".light1Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light1Intensity" 1; + setAttr ".light1Dir_Name" -type "string" "light1Dir"; + setAttr ".light1Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light1Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light1ConeAngle_Name" -type "string" "light1ConeAngle"; + setAttr ".light1ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light1ConeAngle" 45; + setAttr ".light1FallOff_Name" -type "string" "light1FallOff"; + setAttr ".light1FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light1FallOff" 0; + setAttr ".light1AttenScale_Name" -type "string" "light1AttenScale"; + setAttr ".light1AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light1AttenScale" 0; + setAttr ".light1ShadowOn_Name" -type "string" "light1ShadowOn"; + setAttr ".light1ShadowOn_Type" -type "string" "bool"; + setAttr ".light1ShadowOn" yes; + setAttr ".light2Enable_Name" -type "string" "light2Enable"; + setAttr ".light2Enable_Type" -type "string" "bool"; + setAttr -l on -k on ".light2Enable" no; + setAttr ".light2Type_Name" -type "string" "light2Type"; + setAttr ".light2Type_Type" -type "string" "enum"; + setAttr -l on -k on ".light2Type" 2; + setAttr ".light2Pos_Name" -type "string" "light2Pos"; + setAttr ".light2Pos_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Pos" -type "matrix" 1 0 0 0 0 1 0 0 0 0 1 0 100 100 -100 1; + setAttr ".light2Color_Name" -type "string" "light2Color"; + setAttr ".light2Color_Type" -type "string" "color1x3"; + setAttr -l on -k on ".light2Color" -type "float3" 1 1 1 ; + setAttr -l on -k on ".light2Color"; + setAttr ".light2Intensity_Name" -type "string" "light2Intensity"; + setAttr ".light2Intensity_Type" -type "string" "float"; + setAttr -l on -k on ".light2Intensity" 1; + setAttr ".light2Dir_Name" -type "string" "light2Dir"; + setAttr ".light2Dir_Type" -type "string" "matrix1x3"; + setAttr -l on -k on ".light2Dir" -type "matrix" 1 0 0 0 0 1 0 0 -100 -100 -100 0 + 0 0 0 1; + setAttr ".light2ConeAngle_Name" -type "string" "light2ConeAngle"; + setAttr ".light2ConeAngle_Type" -type "string" "float"; + setAttr -l on -k on ".light2ConeAngle" 45; + setAttr ".light2FallOff_Name" -type "string" "light2FallOff"; + setAttr ".light2FallOff_Type" -type "string" "float"; + setAttr -l on -k on ".light2FallOff" 0; + setAttr ".light2AttenScale_Name" -type "string" "light2AttenScale"; + setAttr ".light2AttenScale_Type" -type "string" "float"; + setAttr -l on -k on ".light2AttenScale" 0; + setAttr ".light2ShadowOn_Name" -type "string" "light2ShadowOn"; + setAttr ".light2ShadowOn_Type" -type "string" "bool"; + setAttr ".light2ShadowOn" yes; + setAttr ".UseAmbientOcclusionTexture_Name" -type "string" "UseAmbientOcclusionTexture"; + setAttr ".UseAmbientOcclusionTexture_Type" -type "string" "bool"; + setAttr -k on ".UseAmbientOcclusionTexture" no; + setAttr ".transpDepthTexture_Name" -type "string" "transpDepthTexture"; + setAttr ".transpDepthTexture_Type" -type "string" "texture"; + setAttr ".transpDepthTexture" -type "float3" 0 0 0 ; + setAttr ".opaqueDepthTexture_Name" -type "string" "opaqueDepthTexture"; + setAttr ".opaqueDepthTexture_Type" -type "string" "texture"; + setAttr ".opaqueDepthTexture" -type "float3" 0 0 0 ; + setAttr ".UseDiffuseTexture_Name" -type "string" "UseDiffuseTexture"; + setAttr ".UseDiffuseTexture_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTexture" yes; + setAttr ".UseDiffuseTextureAlpha_Name" -type "string" "UseDiffuseTextureAlpha"; + setAttr ".UseDiffuseTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseTextureAlpha" no; + setAttr ".DiffuseTexture_Name" -type "string" "DiffuseTexture"; + setAttr ".DiffuseTexture_Type" -type "string" "texture"; + setAttr ".DiffuseTexture" -type "float3" 0 0 0 ; + setAttr ".DiffuseColor_Name" -type "string" "DiffuseColor"; + setAttr ".DiffuseColor_Type" -type "string" "color1x3"; + setAttr -k on ".DiffuseColor" -type "float3" 1 1 1 ; + setAttr ".Opacity_Name" -type "string" "Opacity"; + setAttr ".Opacity_Type" -type "string" "float"; + setAttr -k on ".Opacity" 1; + setAttr ".UseOpacityMaskTexture_Name" -type "string" "UseOpacityMaskTexture"; + setAttr ".UseOpacityMaskTexture_Type" -type "string" "bool"; + setAttr -k on ".UseOpacityMaskTexture" no; + setAttr ".OpacityMaskTexture_Name" -type "string" "OpacityMaskTexture"; + setAttr ".OpacityMaskTexture_Type" -type "string" "texture"; + setAttr ".OpacityMaskTexture" -type "float3" 0 0 0 ; + setAttr ".OpacityMaskBias_Name" -type "string" "OpacityMaskBias"; + setAttr ".OpacityMaskBias_Type" -type "string" "float"; + setAttr -k on ".OpacityMaskBias" 0.10000000149011612; + setAttr ".UseSpecularTexture_Name" -type "string" "UseSpecularTexture"; + setAttr ".UseSpecularTexture_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTexture" no; + setAttr ".SpecularTexture_Name" -type "string" "SpecularTexture"; + setAttr ".SpecularTexture_Type" -type "string" "texture"; + setAttr ".SpecularTexture" -type "float3" 0 0 0 ; + setAttr ".SpecularColor_Name" -type "string" "SpecularColor"; + setAttr ".SpecularColor_Type" -type "string" "color1x3"; + setAttr -k on ".SpecularColor" -type "float3" 1 1 1 ; + setAttr ".UseNormalTexture_Name" -type "string" "UseNormalTexture"; + setAttr ".UseNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseNormalTexture" yes; + setAttr ".NormalTexture_Name" -type "string" "NormalTexture"; + setAttr ".NormalTexture_Type" -type "string" "texture"; + setAttr ".NormalTexture" -type "float3" 0 0 0 ; + setAttr ".NormalHeight_Name" -type "string" "NormalHeight"; + setAttr ".NormalHeight_Type" -type "string" "float"; + setAttr -k on ".NormalHeight" 0.5; + setAttr ".SupportNonUniformScale_Name" -type "string" "SupportNonUniformScale"; + setAttr ".SupportNonUniformScale_Type" -type "string" "bool"; + setAttr -k on ".SupportNonUniformScale" yes; + setAttr ".NormalCoordsysX_Name" -type "string" "NormalCoordsysX"; + setAttr ".NormalCoordsysX_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysX" 0; + setAttr ".NormalCoordsysY_Name" -type "string" "NormalCoordsysY"; + setAttr ".NormalCoordsysY_Type" -type "string" "enum"; + setAttr -k on ".NormalCoordsysY" 0; + setAttr ".DisplacementModel_Name" -type "string" "DisplacementModel"; + setAttr ".DisplacementModel_Type" -type "string" "enum"; + setAttr -k on ".DisplacementModel" 0; + setAttr ".UseDisplacementMap_Name" -type "string" "UseDisplacementMap"; + setAttr ".UseDisplacementMap_Type" -type "string" "bool"; + setAttr -k on ".UseDisplacementMap" no; + setAttr ".DisplacementTexture_Name" -type "string" "DisplacementTexture"; + setAttr ".DisplacementTexture_Type" -type "string" "texture"; + setAttr ".DisplacementTexture" -type "float3" 0 0 0 ; + setAttr ".VectorDisplacementCoordSys_Name" -type "string" "VectorDisplacementCoordSys"; + setAttr ".VectorDisplacementCoordSys_Type" -type "string" "enum"; + setAttr -k on ".VectorDisplacementCoordSys" 0; + setAttr ".DisplacementHeight_Name" -type "string" "DisplacementHeight"; + setAttr ".DisplacementHeight_Type" -type "string" "float"; + setAttr -k on ".DisplacementHeight" 0.5; + setAttr ".DisplacementOffset_Name" -type "string" "DisplacementOffset"; + setAttr ".DisplacementOffset_Type" -type "string" "float"; + setAttr -k on ".DisplacementOffset" 0.5; + setAttr ".DisplacementClippingBias_Name" -type "string" "DisplacementClippingBias"; + setAttr ".DisplacementClippingBias_Type" -type "string" "float"; + setAttr -k on ".DisplacementClippingBias" 5; + setAttr ".BBoxExtraScale_Name" -type "string" "BBoxExtraScale"; + setAttr ".BBoxExtraScale_Type" -type "string" "float"; + setAttr -k on ".BBoxExtraScale" 1; + setAttr ".TessellationRange_Name" -type "string" "TessellationRange"; + setAttr ".TessellationRange_Type" -type "string" "float"; + setAttr -k on ".TessellationRange" 0; + setAttr ".TessellationMin_Name" -type "string" "TessellationMin"; + setAttr ".TessellationMin_Type" -type "string" "float"; + setAttr -k on ".TessellationMin" 3; + setAttr ".FlatTessellation_Name" -type "string" "FlatTessellation"; + setAttr ".FlatTessellation_Type" -type "string" "float"; + setAttr -k on ".FlatTessellation" 0; + setAttr ".UseTranslucency_Name" -type "string" "UseTranslucency"; + setAttr ".UseTranslucency_Type" -type "string" "bool"; + setAttr -k on ".UseTranslucency" no; + setAttr ".UseThicknessTexture_Name" -type "string" "UseThicknessTexture"; + setAttr ".UseThicknessTexture_Type" -type "string" "bool"; + setAttr -k on ".UseThicknessTexture" no; + setAttr ".UseDiffuseIBLMap_Name" -type "string" "UseDiffuseIBLMap"; + setAttr ".UseDiffuseIBLMap_Type" -type "string" "bool"; + setAttr -k on ".UseDiffuseIBLMap" yes; + setAttr ".DiffuseIBLIntensity_Name" -type "string" "DiffuseIBLIntensity"; + setAttr ".DiffuseIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".DiffuseIBLIntensity" 0.65499997138977051; + setAttr ".DiffuseTexcoord_Name" -type "string" "DiffuseTexcoord"; + setAttr ".DiffuseTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DiffuseTexcoord" 0; + setAttr ".OpacityMaskTexcoord_Name" -type "string" "OpacityMaskTexcoord"; + setAttr ".OpacityMaskTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OpacityMaskTexcoord" 0; + setAttr ".SpecularTexcoord_Name" -type "string" "SpecularTexcoord"; + setAttr ".SpecularTexcoord_Type" -type "string" "enum"; + setAttr -k on ".SpecularTexcoord" 0; + setAttr ".NormalTexcoord_Name" -type "string" "NormalTexcoord"; + setAttr ".NormalTexcoord_Type" -type "string" "enum"; + setAttr -k on ".NormalTexcoord" 0; + setAttr ".DisplacementTexcoord_Name" -type "string" "DisplacementTexcoord"; + setAttr ".DisplacementTexcoord_Type" -type "string" "enum"; + setAttr -k on ".DisplacementTexcoord" 0; + setAttr ".ThicknessTexcoord_Name" -type "string" "ThicknessTexcoord"; + setAttr ".ThicknessTexcoord_Type" -type "string" "enum"; + setAttr -k on ".ThicknessTexcoord" 0; + setAttr ".light0ShadowMap_Name" -type "string" "light0ShadowMap"; + setAttr ".light0ShadowMap_Type" -type "string" "texture"; + setAttr ".light0ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light1ShadowMap_Name" -type "string" "light1ShadowMap"; + setAttr ".light1ShadowMap_Type" -type "string" "texture"; + setAttr ".light1ShadowMap" -type "float3" 0 0 0 ; + setAttr ".light2ShadowMap_Name" -type "string" "light2ShadowMap"; + setAttr ".light2ShadowMap_Type" -type "string" "texture"; + setAttr ".light2ShadowMap" -type "float3" 0 0 0 ; + setAttr ".screenSize_Name" -type "string" "screenSize"; + setAttr ".screenSize_Type" -type "string" "float1x2"; + setAttr ".screenSize" -type "float2" 0 0 ; + setAttr ".SkyRotation_Name" -type "string" "SkyRotation"; + setAttr ".SkyRotation_Type" -type "string" "float"; + setAttr -k on ".SkyRotation" 12.5; + setAttr ".DiffuseCubeIBL_Name" -type "string" "DiffuseCubeIBL"; + setAttr ".DiffuseCubeIBL_Type" -type "string" "texture"; + setAttr ".DiffuseCubeIBL" -type "float3" 0 0 0 ; + setAttr ".UseSpecCubeIBL_Name" -type "string" "UseSpecCubeIBL"; + setAttr ".UseSpecCubeIBL_Type" -type "string" "bool"; + setAttr -k on ".UseSpecCubeIBL" yes; + setAttr ".SpecularIBLIntensity_Name" -type "string" "SpecularIBLIntensity"; + setAttr ".SpecularIBLIntensity_Type" -type "string" "float"; + setAttr -k on ".SpecularIBLIntensity" 0.020999999716877937; + setAttr ".SpecularCubeIBL_Name" -type "string" "SpecularCubeIBL"; + setAttr ".SpecularCubeIBL_Type" -type "string" "texture"; + setAttr ".SpecularCubeIBL" -type "float3" 0 0 0 ; + setAttr ".LutTexture_Name" -type "string" "LutTexture"; + setAttr ".LutTexture_Type" -type "string" "texture"; + setAttr ".LutTexture" -type "float3" 0 0 0 ; + setAttr ".DitherTexture_Name" -type "string" "DitherTexture"; + setAttr ".DitherTexture_Type" -type "string" "texture"; + setAttr ".DitherTexture" -type "float3" 0 0 0 ; + setAttr ".skinCoeffX_Name" -type "string" "skinCoeffX"; + setAttr ".skinCoeffX_Type" -type "string" "float"; + setAttr -k on ".skinCoeffX" 0.79500001668930054; + setAttr ".skinCoeffY_Name" -type "string" "skinCoeffY"; + setAttr ".skinCoeffY_Type" -type "string" "float"; + setAttr -k on ".skinCoeffY" 0.28799998760223389; + setAttr ".skinCoeffZ_Name" -type "string" "skinCoeffZ"; + setAttr ".skinCoeffZ_Type" -type "string" "float"; + setAttr -k on ".skinCoeffZ" 0.030999999493360519; + setAttr ".NormalBlurring_Name" -type "string" "NormalBlurring"; + setAttr ".NormalBlurring_Type" -type "string" "float"; + setAttr -k on ".NormalBlurring" 1; + setAttr ".ScatteringRadiusTexture_Name" -type "string" "ScatteringRadiusTexture"; + setAttr ".ScatteringRadiusTexture_Type" -type "string" "texture"; + setAttr ".ScatteringRadiusTexture" -type "float3" 0 0 0 ; + setAttr ".UseScatteringRadiusTexture_Name" -type "string" "UseScatteringRadiusTexture"; + setAttr ".UseScatteringRadiusTexture_Type" -type "string" "bool"; + setAttr -k on ".UseScatteringRadiusTexture" no; + setAttr ".skinScattering_Name" -type "string" "skinScattering"; + setAttr ".skinScattering_Type" -type "string" "float"; + setAttr -k on ".skinScattering" 0.43700000643730164; + setAttr ".shadowBlur_Name" -type "string" "shadowBlur"; + setAttr ".shadowBlur_Type" -type "string" "float"; + setAttr -k on ".shadowBlur" 1; + setAttr ".shadowDither_Name" -type "string" "shadowDither"; + setAttr ".shadowDither_Type" -type "string" "float"; + setAttr -k on ".shadowDither" 0.086999997496604919; + setAttr ".shadowScattering_Name" -type "string" "shadowScattering"; + setAttr ".shadowScattering_Type" -type "string" "float"; + setAttr -k on ".shadowScattering" 1; + setAttr ".shadowSaturation_Name" -type "string" "shadowSaturation"; + setAttr ".shadowSaturation_Type" -type "string" "float"; + setAttr -k on ".shadowSaturation" 1.2740000486373901; + setAttr ".BackScatteringThicknessTexture_Name" -type "string" "BackScatteringThicknessTexture"; + setAttr ".BackScatteringThicknessTexture_Type" -type "string" "texture"; + setAttr ".BackScatteringThicknessTexture" -type "float3" 0 0 0 ; + setAttr ".skinScatteringRoughness_Name" -type "string" "skinScatteringRoughness"; + setAttr ".skinScatteringRoughness_Type" -type "string" "float"; + setAttr -k on ".skinScatteringRoughness" 1; + setAttr ".skinScatteringOuterColor_Name" -type "string" "skinScatteringOuterColor"; + setAttr ".skinScatteringOuterColor_Type" -type "string" "color1x3"; + setAttr -k on ".skinScatteringOuterColor" -type "float3" 0.39607844 0.039215688 + 0 ; + setAttr ".skinScatteringAmount_Name" -type "string" "skinScatteringAmount"; + setAttr ".skinScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinScatteringAmount" 0.57599997520446777; + setAttr ".skinAmbientScatteringAmount_Name" -type "string" "skinAmbientScatteringAmount"; + setAttr ".skinAmbientScatteringAmount_Type" -type "string" "float"; + setAttr -k on ".skinAmbientScatteringAmount" 2.1779999732971191; + setAttr ".UseSpecularTextureAlpha_Name" -type "string" "UseSpecularTextureAlpha"; + setAttr ".UseSpecularTextureAlpha_Type" -type "string" "bool"; + setAttr -k on ".UseSpecularTextureAlpha" no; + setAttr ".LobeMix_Name" -type "string" "LobeMix"; + setAttr ".LobeMix_Type" -type "string" "float"; + setAttr -k on ".LobeMix" 0.77100002765655518; + setAttr ".Roughness_Name" -type "string" "Roughness"; + setAttr ".Roughness_Type" -type "string" "float"; + setAttr -k on ".Roughness" 0.31000000238418579; + setAttr ".OcclusionTexture_Name" -type "string" "OcclusionTexture"; + setAttr ".OcclusionTexture_Type" -type "string" "texture"; + setAttr ".OcclusionTexture" -type "float3" 0 0 0 ; + setAttr ".OcclusionAmount_Name" -type "string" "OcclusionAmount"; + setAttr ".OcclusionAmount_Type" -type "string" "float"; + setAttr -k on ".OcclusionAmount" 0.5; + setAttr ".UseCavityTexture_Name" -type "string" "UseCavityTexture"; + setAttr ".UseCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseCavityTexture" no; + setAttr ".CavityTexture_Name" -type "string" "CavityTexture"; + setAttr ".CavityTexture_Type" -type "string" "texture"; + setAttr ".CavityTexture" -type "float3" 0 0 0 ; + setAttr ".CavityAmount_Name" -type "string" "CavityAmount"; + setAttr ".CavityAmount_Type" -type "string" "float"; + setAttr -k on ".CavityAmount" 1; + setAttr ".UseMicroCavityTexture_Name" -type "string" "UseMicroCavityTexture"; + setAttr ".UseMicroCavityTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroCavityTexture" no; + setAttr ".MicroCavityTexture_Name" -type "string" "MicroCavityTexture"; + setAttr ".MicroCavityTexture_Type" -type "string" "texture"; + setAttr ".MicroCavityTexture" -type "float3" 0 0 0 ; + setAttr ".MicroCavityAmount_Name" -type "string" "MicroCavityAmount"; + setAttr ".MicroCavityAmount_Type" -type "string" "float"; + setAttr -k on ".MicroCavityAmount" 1; + setAttr ".UseMicroNormalTexture_Name" -type "string" "UseMicroNormalTexture"; + setAttr ".UseMicroNormalTexture_Type" -type "string" "bool"; + setAttr -k on ".UseMicroNormalTexture" no; + setAttr ".MicroNormalTexture_Name" -type "string" "MicroNormalTexture"; + setAttr ".MicroNormalTexture_Type" -type "string" "texture"; + setAttr ".MicroNormalTexture" -type "float3" 0 0 0 ; + setAttr ".MicroNormalHeight_Name" -type "string" "MicroNormalHeight"; + setAttr ".MicroNormalHeight_Type" -type "string" "float"; + setAttr -k on ".MicroNormalHeight" 1; + setAttr ".MicroScale_Name" -type "string" "MicroScale"; + setAttr ".MicroScale_Type" -type "string" "float"; + setAttr -k on ".MicroScale" 32; + setAttr ".UseBlendTexture_Name" -type "string" "UseBlendTexture"; + setAttr ".UseBlendTexture_Type" -type "string" "bool"; + setAttr -k on ".UseBlendTexture" no; + setAttr ".OcclusionTexcoord_Name" -type "string" "OcclusionTexcoord"; + setAttr ".OcclusionTexcoord_Type" -type "string" "enum"; + setAttr -k on ".OcclusionTexcoord" 1; + setAttr ".Position_Name" -type "string" "Position"; + setAttr ".Position_Source" -type "string" "position"; + setAttr ".TexCoord0_Name" -type "string" "TexCoord0"; + setAttr ".TexCoord0_Source" -type "string" "uv:map1"; + setAttr ".TexCoord0_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord1_Name" -type "string" "TexCoord1"; + setAttr ".TexCoord1_Source" -type "string" "uv:map2"; + setAttr ".TexCoord1_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".TexCoord2_Name" -type "string" "TexCoord2"; + setAttr ".TexCoord2_Source" -type "string" "uv:map3"; + setAttr ".TexCoord2_DefaultTexture" -type "string" "DiffuseTexture"; + setAttr ".Normal_Name" -type "string" "Normal"; + setAttr ".Normal_Source" -type "string" "normal"; + setAttr ".Binormal0_Name" -type "string" "Binormal0"; + setAttr ".Binormal0_Source" -type "string" "binormal:map1"; + setAttr ".Tangent0_Name" -type "string" "Tangent0"; + setAttr ".Tangent0_Source" -type "string" "tangent:map1"; +createNode shadingEngine -n "shader_eyeRight_shaderSG"; + rename -uid "08DB0D16-457D-7243-3E69-0798544194EB"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo5"; + rename -uid "A70EE1B4-4586-A185-7842-5DB58FCBFC41"; +createNode blinn -n "shader_eyeshell_shader"; + rename -uid "3E72F4E7-4540-EFD6-90B8-3D99D80B4B35"; + setAttr ".it" -type "float3" 0.97000003 0.97000003 0.97000003 ; + setAttr ".sc" -type "float3" 0.25 0.25 0.25 ; + setAttr ".ec" 0.20000000298023224; + setAttr ".sro" 0.20000000298023224; +createNode shadingEngine -n "shader_eyeshell_shaderSG"; + rename -uid "4132A590-46B4-5FFE-17AF-FD8910E2169C"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo6"; + rename -uid "BA30FFE2-490D-49F7-DF36-9FA95F3F231E"; +createNode blinn -n "shader_eyelashes_shader"; + rename -uid "CDFC281A-42C5-CEEF-15C1-2A95DD22968F"; + setAttr ".sc" -type "float3" 0.25 0.25 0.25 ; + setAttr ".ec" 0.20000000298023224; + setAttr ".sro" 0.20000000298023224; +createNode shadingEngine -n "shader_eyelashes_shaderSG"; + rename -uid "0EDFA50A-4708-7F7E-4BD3-5AADADC4C8BC"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo7"; + rename -uid "35015A5B-481E-09FF-020E-9282579A0328"; +createNode blinn -n "shader_eyelashesShadow_shader"; + rename -uid "29FDA1D0-4827-4715-B5FF-0A90C10EA067"; + setAttr ".it" -type "float3" 1 1 1 ; + setAttr ".sc" -type "float3" 0.25 0.25 0.25 ; + setAttr ".ec" 0.20000000298023224; + setAttr ".sro" 0.20000000298023224; +createNode shadingEngine -n "shader_eyelashesShadow_shaderSG"; + rename -uid "4A350F6C-4197-6714-EAD8-079EB9404285"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo8"; + rename -uid "0DABDD32-478C-CB30-2B38-2CB15CD03FCA"; +createNode blinn -n "shader_eyeEdge_shader"; + rename -uid "0F029626-4DD0-1000-A2F4-57834E9B2456"; + setAttr ".it" -type "float3" 0.89999998 0.89999998 0.89999998 ; + setAttr ".sc" -type "float3" 0.25 0.25 0.25 ; + setAttr ".ec" 0.20000000298023224; + setAttr ".sro" 0.20000000298023224; +createNode shadingEngine -n "shader_eyeEdge_shaderSG"; + rename -uid "A6868C2B-4DAA-C33C-8598-E4B2CD78F53E"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo9"; + rename -uid "0C4D46BA-4695-DB5B-25B7-1C97AA87D7E9"; +createNode file -n "baseMapFile_dx11_diffuseIrradiance"; + rename -uid "23F1BF79-4B31-3F7D-B2FA-36ABECFBB427"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/maps/dx11_diffuseIrradiance_map.dds"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_dx11_specularIrradiance"; + rename -uid "F5E75DA3-4947-2290-AFE5-96A845991E8C"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/maps/dx11_specularIrradiance_map.dds"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_dx11_jitter"; + rename -uid "8409A0AC-49BC-1ACC-8ECF-4FAE1A1FA1D1"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/maps/dx11_jitter_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_dx11_skinLUT"; + rename -uid "B4922940-4205-4CA2-458A-4C96D8C8461B"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/maps/dx11_skinLUT_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_head_color"; + rename -uid "722F9311-4BBA-D218-B589-17B6D45D5075"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_cm1_color"; + rename -uid "A679444E-4346-772D-769B-CC81935051BA"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_cm1_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_cm2_color"; + rename -uid "0E1F7B77-40A0-5F0B-7F47-4098DC7D262C"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_cm2_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_cm3_color"; + rename -uid "85C975E2-43D9-2625-AE7E-1D935C067AC6"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_cm3_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_head_normal"; + rename -uid "25C0C890-4B78-B420-6EB1-F08AE9263FC1"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_wm1_normal"; + rename -uid "B5289838-43D7-B9DA-38D0-8C83ADAB1E11"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_wm2_normal"; + rename -uid "D9D451EE-4485-EB2D-2E36-E2A9BE18D1E3"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "mapFile_head_wm3_normal"; + rename -uid "26D9019B-4B20-C6AF-C99C-2CB82044CAA1"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_head_cavity"; + rename -uid "BE857633-40BA-F4A9-BB1A-F6B78137E888"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_cavity_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_blink_L"; + rename -uid "91361518-445B-4451-2E3B-8A9BE930F9E2"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_blink_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_blink_R"; + rename -uid "A7235AE1-421E-EF06-B887-D09927A803E2"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_blink_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_browsRaiseInner_L"; + rename -uid "C834CE2A-43A0-F39F-F702-B6A4078F9C0A"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_browsRaiseInner_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_browsRaiseInner_R"; + rename -uid "DC02C7E0-486C-F927-2EC2-21884539BB15"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_browsRaiseInner_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_browsRaiseOuter_L"; + rename -uid "21CACE3C-4209-4F2B-0D98-C28757094B0B"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_browsRaiseOuter_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_browsRaiseOuter_R"; + rename -uid "FBA67835-447F-ECB7-F2B7-13B461D9380C"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_browsRaiseOuter_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_chinRaise_L"; + rename -uid "2DFBCA2D-4C7D-4E5A-B39E-1B91329DE3F8"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_chinRaise_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_chinRaise_R"; + rename -uid "777AE005-4E77-C9B8-FC9F-5B88534111DB"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_chinRaise_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_jawOpen"; + rename -uid "9E74927E-471B-3704-4C30-4C94358F0EAA"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_jawOpen_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_purse_DL"; + rename -uid "EB62726E-4FEC-356E-2EEF-21A2C367AB56"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_purse_DL_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_purse_DR"; + rename -uid "3C996D8C-4082-8ABF-D1D3-C0A52E92A23E"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_purse_DR_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_purse_UL"; + rename -uid "7CE84665-4D42-FFD0-A79C-38B3390E7BAF"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_purse_UL_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_purse_UR"; + rename -uid "50C3047A-4E58-5CA1-9E4C-81B5AA8FF5CD"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_purse_UR_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_squintInner_L"; + rename -uid "073CC0B7-4868-AC36-4915-5BA7A1C25A2D"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_squintInner_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm1_squintInner_R"; + rename -uid "42D2A40D-4121-CC7B-E50E-F1835FF6BA65"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm1_squintInner_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_browsDown_L"; + rename -uid "4B9D557E-4A01-0C9A-2698-0C98A77E66E2"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_browsDown_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_browsDown_R"; + rename -uid "BAD4D122-4C88-263B-5CCA-52AEBE8965A5"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_browsDown_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_browsLateral_L"; + rename -uid "960C388E-4130-A4FF-32F6-DC89E94553A2"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_browsLateral_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_browsLateral_R"; + rename -uid "CB0E5006-4858-283A-8ED4-C2B8E91BDA58"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_browsLateral_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_mouthStretch_L"; + rename -uid "11F7806B-48CD-E6E6-D626-B59450BEB900"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_mouthStretch_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_mouthStretch_R"; + rename -uid "4E3CE38C-48FA-4393-0062-50A86B60F43D"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_mouthStretch_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_neckStretch_L"; + rename -uid "34C32F57-4F18-5DBE-D17F-C0B61EFE8F85"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_neckStretch_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_neckStretch_R"; + rename -uid "F7B7CE3A-45A4-F62F-C3E4-1B98812DC10D"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_neckStretch_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_noseWrinkler_L"; + rename -uid "B3B2708D-4505-429B-AEBE-6681412675F5"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_noseWrinkler_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm2_noseWrinkler_R"; + rename -uid "A2D212EB-4F4E-8400-1BDB-298467CA65E1"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm2_noseWrinkler_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseInner_L"; + rename -uid "F2BA15F1-4DE9-AADE-F965-9F931B9A3AA4"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseInner_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseInner_R"; + rename -uid "5F0AFDFF-40CE-DBE5-DBAE-03B0F29E8334"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseInner_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseOuter_L"; + rename -uid "F60460E9-477A-7673-06A3-AD972C0C2D62"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseOuter_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseOuter_R"; + rename -uid "6B562DFD-424A-874F-ED6C-798A825DC890"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseOuter_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseUpper_L"; + rename -uid "A2BDE9B1-45B0-0F46-B936-E2AFB02AB7B6"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseUpper_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_cheekRaiseUpper_R"; + rename -uid "87411C60-4DF3-E7EA-6D78-0E84496A30F3"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_cheekRaiseUpper_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_smile_L"; + rename -uid "1E9D65BD-4458-BBDE-ED6A-4A8E6BEB8AB1"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_smile_L_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm3_smile_R"; + rename -uid "45A29737-4B56-A3CD-1B3B-F787C59947EC"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm3_smile_R_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm13_lips_DL"; + rename -uid "7F5949B2-4183-64CF-E628-F8A4A8081BA8"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm13_lips_DL_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm13_lips_DR"; + rename -uid "38EF5569-4CC9-A9CB-14FA-CB8F3BD5173A"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm13_lips_DR_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm13_lips_UL"; + rename -uid "0F981403-487C-D2C8-80FC-4D8F2C430A53"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm13_lips_UL_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "maskFile_head_wm13_lips_UR"; + rename -uid "2472A5AF-4EE9-748C-9F81-CDB66B647AA0"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/head_wm13_lips_UR_msk.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_teeth_color"; + rename -uid "06DE46C6-4DEE-80C4-4F56-A1B2AFE2C9CC"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/teeth_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_teeth_normal"; + rename -uid "37ABA80D-483E-C1F4-3743-5782F241352E"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/teeth_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_eyes_color"; + rename -uid "2C5CE88F-4100-916C-F571-C9B4FF3E4464"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/eyes_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_eyes_normal"; + rename -uid "76113BEE-474E-BF46-2F98-C98AAB36C098"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/eyes_normal_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode file -n "baseMapFile_eyelashes_color"; + rename -uid "4BBAA10E-4FC9-326C-CABF-C38F37ECEE20"; + setAttr ".ftn" -type "string" "$PROJECT_ROOT/Common/SourceAssets/masks/eyelashes_color_map.tga"; + setAttr ".cs" -type "string" "sRGB"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo1"; + rename -uid "14159383-4987-9C61-EACB-32895CF4C8BE"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo2"; + rename -uid "782A145D-4DB8-5E8D-F4BC-83AFB5738FF1"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo1"; + rename -uid "14132E49-44D5-D6FB-9AFF-01BBFBBD79FA"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo4"; + rename -uid "C618C44F-42E2-1860-509D-98B02734C109"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo"; + rename -uid "01654B32-41C8-7686-6EC9-FC96D34D05D2"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "skeleton_015_hyperShadePrimaryNodeEditorSavedTabsInfo"; + rename -uid "749886FE-4137-2C09-9FD0-6FB9DA7E946B"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo1"; + rename -uid "01B83B1A-4A70-70DD-9752-6DBD68D9C095"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -330.95236780151544 -323.80951094248991 ; + setAttr ".tgi[0].vh" -type "double2" 317.85713022663526 338.09522466054096 ; + setAttr -s 32 ".tgi[0].ni"; + setAttr ".tgi[0].ni[0].x" -1517.142822265625; + setAttr ".tgi[0].ni[0].y" 838.5714111328125; + setAttr ".tgi[0].ni[0].nvs" 1922; + setAttr ".tgi[0].ni[1].x" -1502.857177734375; + setAttr ".tgi[0].ni[1].y" 798.5714111328125; + setAttr ".tgi[0].ni[1].nvs" 1922; + setAttr ".tgi[0].ni[2].x" 1320; + setAttr ".tgi[0].ni[2].y" 850; + setAttr ".tgi[0].ni[2].nvs" 1922; + setAttr ".tgi[0].ni[3].x" 998.5714111328125; + setAttr ".tgi[0].ni[3].y" 955.71429443359375; + setAttr ".tgi[0].ni[3].nvs" 1922; + setAttr ".tgi[0].ni[4].x" 998.5714111328125; + setAttr ".tgi[0].ni[4].y" 771.4285888671875; + setAttr ".tgi[0].ni[4].nvs" 1922; + setAttr ".tgi[0].ni[5].x" 1320; + setAttr ".tgi[0].ni[5].y" 665.71429443359375; + setAttr ".tgi[0].ni[5].nvs" 1922; + setAttr ".tgi[0].ni[6].x" 647.14288330078125; + setAttr ".tgi[0].ni[6].y" 950; + setAttr ".tgi[0].ni[6].nvs" 1922; + setAttr ".tgi[0].ni[7].x" 1320; + setAttr ".tgi[0].ni[7].y" 1218.5714111328125; + setAttr ".tgi[0].ni[7].nvs" 1922; + setAttr ".tgi[0].ni[8].x" 998.5714111328125; + setAttr ".tgi[0].ni[8].y" 1174.2857666015625; + setAttr ".tgi[0].ni[8].nvs" 1922; + setAttr ".tgi[0].ni[9].x" -1195.7142333984375; + setAttr ".tgi[0].ni[9].y" 817.14288330078125; + setAttr ".tgi[0].ni[9].nvs" 1922; + setAttr ".tgi[0].ni[10].x" 1320; + setAttr ".tgi[0].ni[10].y" 504.28570556640625; + setAttr ".tgi[0].ni[10].nvs" 1922; + setAttr ".tgi[0].ni[11].x" -888.5714111328125; + setAttr ".tgi[0].ni[11].y" 841.4285888671875; + setAttr ".tgi[0].ni[11].nvs" 1922; + setAttr ".tgi[0].ni[12].x" -581.4285888671875; + setAttr ".tgi[0].ni[12].y" 597.14288330078125; + setAttr ".tgi[0].ni[12].nvs" 1922; + setAttr ".tgi[0].ni[13].x" 1320; + setAttr ".tgi[0].ni[13].y" -237.14285278320313; + setAttr ".tgi[0].ni[13].nvs" 1922; + setAttr ".tgi[0].ni[14].x" -274.28570556640625; + setAttr ".tgi[0].ni[14].y" 512.85711669921875; + setAttr ".tgi[0].ni[14].nvs" 1922; + setAttr ".tgi[0].ni[15].x" 1320; + setAttr ".tgi[0].ni[15].y" -505.71429443359375; + setAttr ".tgi[0].ni[15].nvs" 1922; + setAttr ".tgi[0].ni[16].x" 1320; + setAttr ".tgi[0].ni[16].y" -690; + setAttr ".tgi[0].ni[16].nvs" 1922; + setAttr ".tgi[0].ni[17].x" 32.857143402099609; + setAttr ".tgi[0].ni[17].y" 342.85714721679688; + setAttr ".tgi[0].ni[17].nvs" 1922; + setAttr ".tgi[0].ni[18].x" 1320; + setAttr ".tgi[0].ni[18].y" -874.28570556640625; + setAttr ".tgi[0].ni[18].nvs" 1922; + setAttr ".tgi[0].ni[19].x" 340; + setAttr ".tgi[0].ni[19].y" 760; + setAttr ".tgi[0].ni[19].nvs" 1922; + setAttr ".tgi[0].ni[20].x" 1320; + setAttr ".tgi[0].ni[20].y" 85.714286804199219; + setAttr ".tgi[0].ni[20].nvs" 1922; + setAttr ".tgi[0].ni[21].x" 647.14288330078125; + setAttr ".tgi[0].ni[21].y" 288.57144165039063; + setAttr ".tgi[0].ni[21].nvs" 1922; + setAttr ".tgi[0].ni[22].x" 1320; + setAttr ".tgi[0].ni[22].y" -75.714286804199219; + setAttr ".tgi[0].ni[22].nvs" 1922; + setAttr ".tgi[0].ni[23].x" 998.5714111328125; + setAttr ".tgi[0].ni[23].y" 552.85711669921875; + setAttr ".tgi[0].ni[23].nvs" 1922; + setAttr ".tgi[0].ni[24].x" 998.5714111328125; + setAttr ".tgi[0].ni[24].y" -1078.5714111328125; + setAttr ".tgi[0].ni[24].nvs" 1922; + setAttr ".tgi[0].ni[25].x" 998.5714111328125; + setAttr ".tgi[0].ni[25].y" -470; + setAttr ".tgi[0].ni[25].nvs" 1922; + setAttr ".tgi[0].ni[26].x" 1320; + setAttr ".tgi[0].ni[26].y" 320; + setAttr ".tgi[0].ni[26].nvs" 1922; + setAttr ".tgi[0].ni[27].x" 998.5714111328125; + setAttr ".tgi[0].ni[27].y" 254.28572082519531; + setAttr ".tgi[0].ni[27].nvs" 1922; + setAttr ".tgi[0].ni[28].x" 1320; + setAttr ".tgi[0].ni[28].y" 1034.2857666015625; + setAttr ".tgi[0].ni[28].nvs" 1922; + setAttr ".tgi[0].ni[29].x" 998.5714111328125; + setAttr ".tgi[0].ni[29].y" 70; + setAttr ".tgi[0].ni[29].nvs" 1922; + setAttr ".tgi[0].ni[30].x" 998.5714111328125; + setAttr ".tgi[0].ni[30].y" -745.71429443359375; + setAttr ".tgi[0].ni[30].nvs" 1922; + setAttr ".tgi[0].ni[31].x" 998.5714111328125; + setAttr ".tgi[0].ni[31].y" -285.71429443359375; + setAttr ".tgi[0].ni[31].nvs" 1922; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo2"; + rename -uid "145CD280-44CE-FF7C-7C2F-598EC8F48331"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -323.80951094248991 -330.95236780151544 ; + setAttr ".tgi[0].vh" -type "double2" 324.99998708566085 330.95236780151544 ; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo8"; + rename -uid "9EBCA29C-4F60-25C7-4118-4CAC6076DB71"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo9"; + rename -uid "429B6F17-4581-4067-D58E-1EA927B2D0C0"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo3"; + rename -uid "732C00B2-40E6-2CDC-49FE-B28F30B26910"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo10"; + rename -uid "4F62F2A2-4464-D344-9715-9B94864A5AD7"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo2"; + rename -uid "3B92B95D-4607-5563-0814-42A1F236D2FA"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo5"; + rename -uid "4DA4A39C-401D-1AAD-CF07-97A0F0B87BC0"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo5"; + rename -uid "9A668D43-435A-752C-1A98-FA803F2CE156"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo6"; + rename -uid "06966ECE-4A8C-7682-EC3E-349577584C96"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo2"; + rename -uid "8C2DFF99-4AC5-B2EF-2F27-EC87F4E17A51"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo7"; + rename -uid "0EB083BC-4177-F1E8-3F03-B9B6F28E3F49"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo1"; + rename -uid "1708B0C5-46E0-2DAA-DDFE-08B7E8E66635"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo3"; + rename -uid "CE8F8401-49D3-4676-219C-8BA4EA6C683A"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode animLayer -n "BaseAnimation"; + rename -uid "39AE5AE3-4966-E594-40C2-6EAE4E4C2BA7"; + setAttr ".pref" yes; + setAttr ".slct" yes; + setAttr ".ovrd" yes; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo11"; + rename -uid "73362A08-48E6-F375-BAFB-8BB9A656AC43"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo12"; + rename -uid "B6EA4974-4D18-AE12-6E54-8F9F56547531"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo4"; + rename -uid "59C6FF06-421A-5DE1-B933-DBAFF2C5D5CD"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo13"; + rename -uid "4762D3DC-46A4-556D-CA59-6CBB04B7988A"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo3"; + rename -uid "AE1FD8F1-482C-36F9-3A8C-CFA961DD54CB"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo6"; + rename -uid "8ED089A1-484D-8821-BFA9-18A9A243F1DB"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo7"; + rename -uid "80BC8964-478B-615A-1589-0D918B4AC09C"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -330.95236780151544 -323.80951094248991 ; + setAttr ".tgi[0].vh" -type "double2" 317.85713022663526 338.09522466054096 ; + setAttr -s 32 ".tgi[0].ni"; + setAttr ".tgi[0].ni[0].x" -1517.142822265625; + setAttr ".tgi[0].ni[0].y" 838.5714111328125; + setAttr ".tgi[0].ni[0].nvs" 1922; + setAttr ".tgi[0].ni[1].x" -1502.857177734375; + setAttr ".tgi[0].ni[1].y" 798.5714111328125; + setAttr ".tgi[0].ni[1].nvs" 1922; + setAttr ".tgi[0].ni[2].x" 1320; + setAttr ".tgi[0].ni[2].y" 850; + setAttr ".tgi[0].ni[2].nvs" 1922; + setAttr ".tgi[0].ni[3].x" 998.5714111328125; + setAttr ".tgi[0].ni[3].y" 955.71429443359375; + setAttr ".tgi[0].ni[3].nvs" 1922; + setAttr ".tgi[0].ni[4].x" 998.5714111328125; + setAttr ".tgi[0].ni[4].y" 771.4285888671875; + setAttr ".tgi[0].ni[4].nvs" 1922; + setAttr ".tgi[0].ni[5].x" 1320; + setAttr ".tgi[0].ni[5].y" 665.71429443359375; + setAttr ".tgi[0].ni[5].nvs" 1922; + setAttr ".tgi[0].ni[6].x" 647.14288330078125; + setAttr ".tgi[0].ni[6].y" 950; + setAttr ".tgi[0].ni[6].nvs" 1922; + setAttr ".tgi[0].ni[7].x" 1320; + setAttr ".tgi[0].ni[7].y" 1218.5714111328125; + setAttr ".tgi[0].ni[7].nvs" 1922; + setAttr ".tgi[0].ni[8].x" 998.5714111328125; + setAttr ".tgi[0].ni[8].y" 1174.2857666015625; + setAttr ".tgi[0].ni[8].nvs" 1922; + setAttr ".tgi[0].ni[9].x" -1195.7142333984375; + setAttr ".tgi[0].ni[9].y" 817.14288330078125; + setAttr ".tgi[0].ni[9].nvs" 1922; + setAttr ".tgi[0].ni[10].x" 1320; + setAttr ".tgi[0].ni[10].y" 504.28570556640625; + setAttr ".tgi[0].ni[10].nvs" 1922; + setAttr ".tgi[0].ni[11].x" -888.5714111328125; + setAttr ".tgi[0].ni[11].y" 841.4285888671875; + setAttr ".tgi[0].ni[11].nvs" 1922; + setAttr ".tgi[0].ni[12].x" -581.4285888671875; + setAttr ".tgi[0].ni[12].y" 597.14288330078125; + setAttr ".tgi[0].ni[12].nvs" 1922; + setAttr ".tgi[0].ni[13].x" 1320; + setAttr ".tgi[0].ni[13].y" -237.14285278320313; + setAttr ".tgi[0].ni[13].nvs" 1922; + setAttr ".tgi[0].ni[14].x" -274.28570556640625; + setAttr ".tgi[0].ni[14].y" 512.85711669921875; + setAttr ".tgi[0].ni[14].nvs" 1922; + setAttr ".tgi[0].ni[15].x" 1320; + setAttr ".tgi[0].ni[15].y" -505.71429443359375; + setAttr ".tgi[0].ni[15].nvs" 1922; + setAttr ".tgi[0].ni[16].x" 1320; + setAttr ".tgi[0].ni[16].y" -690; + setAttr ".tgi[0].ni[16].nvs" 1922; + setAttr ".tgi[0].ni[17].x" 32.857143402099609; + setAttr ".tgi[0].ni[17].y" 342.85714721679688; + setAttr ".tgi[0].ni[17].nvs" 1922; + setAttr ".tgi[0].ni[18].x" 1320; + setAttr ".tgi[0].ni[18].y" -874.28570556640625; + setAttr ".tgi[0].ni[18].nvs" 1922; + setAttr ".tgi[0].ni[19].x" 340; + setAttr ".tgi[0].ni[19].y" 760; + setAttr ".tgi[0].ni[19].nvs" 1922; + setAttr ".tgi[0].ni[20].x" 1320; + setAttr ".tgi[0].ni[20].y" 85.714286804199219; + setAttr ".tgi[0].ni[20].nvs" 1922; + setAttr ".tgi[0].ni[21].x" 647.14288330078125; + setAttr ".tgi[0].ni[21].y" 288.57144165039063; + setAttr ".tgi[0].ni[21].nvs" 1922; + setAttr ".tgi[0].ni[22].x" 1320; + setAttr ".tgi[0].ni[22].y" -75.714286804199219; + setAttr ".tgi[0].ni[22].nvs" 1922; + setAttr ".tgi[0].ni[23].x" 998.5714111328125; + setAttr ".tgi[0].ni[23].y" 552.85711669921875; + setAttr ".tgi[0].ni[23].nvs" 1922; + setAttr ".tgi[0].ni[24].x" 998.5714111328125; + setAttr ".tgi[0].ni[24].y" -1078.5714111328125; + setAttr ".tgi[0].ni[24].nvs" 1922; + setAttr ".tgi[0].ni[25].x" 998.5714111328125; + setAttr ".tgi[0].ni[25].y" -470; + setAttr ".tgi[0].ni[25].nvs" 1922; + setAttr ".tgi[0].ni[26].x" 1320; + setAttr ".tgi[0].ni[26].y" 320; + setAttr ".tgi[0].ni[26].nvs" 1922; + setAttr ".tgi[0].ni[27].x" 998.5714111328125; + setAttr ".tgi[0].ni[27].y" 254.28572082519531; + setAttr ".tgi[0].ni[27].nvs" 1922; + setAttr ".tgi[0].ni[28].x" 1320; + setAttr ".tgi[0].ni[28].y" 1034.2857666015625; + setAttr ".tgi[0].ni[28].nvs" 1922; + setAttr ".tgi[0].ni[29].x" 998.5714111328125; + setAttr ".tgi[0].ni[29].y" 70; + setAttr ".tgi[0].ni[29].nvs" 1922; + setAttr ".tgi[0].ni[30].x" 998.5714111328125; + setAttr ".tgi[0].ni[30].y" -745.71429443359375; + setAttr ".tgi[0].ni[30].nvs" 1922; + setAttr ".tgi[0].ni[31].x" 998.5714111328125; + setAttr ".tgi[0].ni[31].y" -285.71429443359375; + setAttr ".tgi[0].ni[31].nvs" 1922; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo8"; + rename -uid "A51E528C-42D6-3C56-F4BC-F4A1898C389C"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -323.80951094248991 -330.95236780151544 ; + setAttr ".tgi[0].vh" -type "double2" 324.99998708566085 330.95236780151544 ; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo17"; + rename -uid "9C24CC1E-45E3-D73D-B0ED-54801CA1D618"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo18"; + rename -uid "E459A66D-481D-D442-E8E2-F49F204FD8D1"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo6"; + rename -uid "E94E0393-4214-2855-EC59-65913192F9F9"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo19"; + rename -uid "C15167D7-4B70-C741-B24A-97A8844C3DE5"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo5"; + rename -uid "0822E6FB-4953-D625-58C0-F7BB07355E25"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo10"; + rename -uid "7E6FD770-4361-BDBE-24B7-DB94D8343F53"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo14"; + rename -uid "F9D1C673-43F2-7F2C-B524-21A20D24F39E"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo15"; + rename -uid "7BB98078-4662-C4AD-A44C-1396FD4FF908"; +createNode nodeGraphEditorBookmarkInfo -n "JointMover_nodeGraphEditorBookmarkInfo5"; + rename -uid "804FC654-409C-A09E-AD63-729B633F8205"; +createNode nodeGraphEditorBookmarkInfo -n "nodeGraphEditorBookmarkInfo16"; + rename -uid "B5558253-4C81-6B0C-7279-40AE4273E640"; + addAttr -ci true -sn "rigModule" -ln "rigModule" -dt "string"; + setAttr ".vl" -type "double2" -113.09523809523813 -739.16292609940172 ; + setAttr ".vh" -type "double2" 552.38095238095241 92.682311995836656 ; + setAttr ".rigModule" -type "string" "faceModule"; +createNode nodeGraphEditorInfo -n "faceMask_low_hyperShadePrimaryNodeEditorSavedTabsInfo4"; + rename -uid "26F87E92-4EEB-14AE-D551-8C8B2288FF0A"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1681.7975162529422 -433.33331611421443 ; + setAttr ".tgi[0].vh" -type "double2" 1660.3689456758657 452.38093440494913 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo9"; + rename -uid "50F6A87F-4F60-D52E-AC8C-2E841417E0E2"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -650.23992537612548 -757.14282705670439 ; + setAttr ".tgi[0].vh" -type "double2" 1889.5255904170522 541.66664514276806 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo11"; + rename -uid "94769AF7-4458-2DBD-8BBE-8BA87E818A15"; + setAttr ".def" no; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -332.47365071468624 -366.66665209664302 ; + setAttr ".tgi[0].vh" -type "double2" 401.52126701859942 382.1428419578649 ; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo12"; + rename -uid "F8546B9F-41A8-D8FA-BD86-A0B8D8A3449A"; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -1277.4406000935428 -178.26989501506873 ; + setAttr ".tgi[0].vh" -type "double2" 581.03553706445609 490.35014659303152 ; + setAttr -s 3 ".tgi[0].ni"; + setAttr ".tgi[0].ni[0].x" -418.57144165039063; + setAttr ".tgi[0].ni[0].y" 440; + setAttr ".tgi[0].ni[0].nvs" 1923; + setAttr ".tgi[0].ni[1].x" -725.71429443359375; + setAttr ".tgi[0].ni[1].y" 291.42855834960938; + setAttr ".tgi[0].ni[1].nvs" 1923; + setAttr ".tgi[0].ni[2].x" -111.42857360839844; + setAttr ".tgi[0].ni[2].y" 440; + setAttr ".tgi[0].ni[2].nvs" 1923; +select -ne :time1; + setAttr -av -k on ".cch"; + setAttr -k on ".fzn"; + setAttr -av -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".o" 0; + setAttr -av -k on ".unw"; + setAttr -av -k on ".etw"; + setAttr -av -k on ".tps"; + setAttr -av -k on ".tms"; +select -ne :hardwareRenderingGlobals; + setAttr -av -k on ".cch"; + setAttr -av -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 ; + setAttr -k on ".hwi"; + setAttr -av ".ta"; + setAttr -av ".tq"; + setAttr -av ".etmr"; + setAttr -av ".tmr"; + setAttr -av ".aoon"; + setAttr -av ".aoam"; + setAttr -av ".aora"; + setAttr -k on ".hff"; + setAttr -av -k on ".hfd"; + setAttr -av -k on ".hfs"; + setAttr -av -k on ".hfe"; + setAttr -av ".hfc"; + setAttr -av -k on ".hfcr"; + setAttr -av -k on ".hfcg"; + setAttr -av -k on ".hfcb"; + setAttr -av -k on ".hfa"; + setAttr -av ".mbe"; + setAttr -av -k on ".mbsof"; + setAttr -k on ".blen"; + setAttr -k on ".blat"; + setAttr -av ".msaa"; + setAttr ".fprt" yes; +select -ne :renderPartition; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 11 ".st"; + setAttr -cb on ".an"; + setAttr -cb on ".pt"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 13 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -k on ".ihi"; +select -ne :defaultTextureList1; + setAttr -s 55 ".tx"; +select -ne :initialShadingGroup; + setAttr -av -k on ".cch"; + setAttr -k on ".fzn"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".bbx"; + setAttr -k on ".vwm"; + setAttr -k on ".tpv"; + setAttr -k on ".uit"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +select -ne :initialParticleSE; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +lockNode -l 0 -lu 1; +select -ne :defaultResolution; + setAttr -av -k on ".cch"; + setAttr -av -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -av -k on ".w"; + setAttr -av -k on ".h"; + setAttr -av -k on ".pa" 1; + setAttr -av -k on ".al"; + setAttr -av -k on ".dar"; + setAttr -av -k on ".ldar"; + setAttr -av -k on ".dpi"; + setAttr -av -k on ".off"; + setAttr -av -k on ".fld"; + setAttr -av -k on ".zsl"; + setAttr -av -k on ".isu"; + setAttr -av -k on ".pdu"; +select -ne :hardwareRenderGlobals; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -av -k off -cb on ".ctrs" 256; + setAttr -av -k off -cb on ".btrs" 512; + setAttr -av -k off -cb on ".fbfm"; + setAttr -av -k off -cb on ".ehql"; + setAttr -av -k off -cb on ".eams"; + setAttr -av -k off -cb on ".eeaa"; + setAttr -av -k off -cb on ".engm"; + setAttr -av -k off -cb on ".mes"; + setAttr -av -k off -cb on ".emb"; + setAttr -av -k off -cb on ".mbbf"; + setAttr -av -k off -cb on ".mbs"; + setAttr -av -k off -cb on ".trm"; + setAttr -av -k off -cb on ".tshc"; + setAttr -av -k off -cb on ".enpt"; + setAttr -av -k off -cb on ".clmt"; + setAttr -av -k off -cb on ".tcov"; + setAttr -av -k off -cb on ".lith"; + setAttr -av -k off -cb on ".sobc"; + setAttr -av -k off -cb on ".cuth"; + setAttr -av -k off -cb on ".hgcd"; + setAttr -av -k off -cb on ".hgci"; + setAttr -av -k off -cb on ".mgcs"; + setAttr -av -k off -cb on ".twa"; + setAttr -av -k off -cb on ".twz"; + setAttr -cb on ".hwcc"; + setAttr -cb on ".hwdp"; + setAttr -cb on ".hwql"; + setAttr -k on ".hwfr"; + setAttr -k on ".soll"; + setAttr -k on ".sosl"; + setAttr -k on ".bswa"; + setAttr -k on ".shml"; + setAttr -k on ".hwel"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_head_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_teeth_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_saliva_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyeLeft_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyeRight_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyeshell_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyelashes_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyelashesShadow_shaderSG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "shader_eyeEdge_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_head_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_teeth_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_saliva_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyeLeft_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyeRight_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyeshell_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyelashes_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyelashesShadow_shaderSG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "shader_eyeEdge_shaderSG.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "baseMapFile_dx11_diffuseIrradiance.oc" "shader_head_shader.DiffuseCubeIBL" + ; +connectAttr "baseMapFile_dx11_specularIrradiance.oc" "shader_head_shader.SpecularCubeIBL" + ; +connectAttr "baseMapFile_dx11_jitter.oc" "shader_head_shader.DitherTexture"; +connectAttr "baseMapFile_dx11_skinLUT.oc" "shader_head_shader.LutTexture"; +connectAttr "baseMapFile_head_color.oc" "shader_head_shader.DiffuseTexture"; +connectAttr "mapFile_head_cm1_color.oc" "shader_head_shader.animColorMap_00"; +connectAttr "mapFile_head_cm2_color.oc" "shader_head_shader.animColorMap_01"; +connectAttr "mapFile_head_cm3_color.oc" "shader_head_shader.animColorMap_02"; +connectAttr "baseMapFile_head_normal.oc" "shader_head_shader.NormalTexture"; +connectAttr "mapFile_head_wm1_normal.oc" "shader_head_shader.animNormalMap_00"; +connectAttr "mapFile_head_wm2_normal.oc" "shader_head_shader.animNormalMap_01"; +connectAttr "mapFile_head_wm3_normal.oc" "shader_head_shader.animNormalMap_02"; +connectAttr "baseMapFile_head_cavity.oc" "shader_head_shader.CavityTexture"; +connectAttr "maskFile_head_wm1_blink_L.oc" "shader_head_shader.maskChannel_00"; +connectAttr "maskFile_head_wm1_blink_R.oc" "shader_head_shader.maskChannel_01"; +connectAttr "maskFile_head_wm1_browsRaiseInner_L.oc" "shader_head_shader.maskChannel_02" + ; +connectAttr "maskFile_head_wm1_browsRaiseInner_R.oc" "shader_head_shader.maskChannel_03" + ; +connectAttr "maskFile_head_wm1_browsRaiseOuter_L.oc" "shader_head_shader.maskChannel_04" + ; +connectAttr "maskFile_head_wm1_browsRaiseOuter_R.oc" "shader_head_shader.maskChannel_05" + ; +connectAttr "maskFile_head_wm1_chinRaise_L.oc" "shader_head_shader.maskChannel_06" + ; +connectAttr "maskFile_head_wm1_chinRaise_R.oc" "shader_head_shader.maskChannel_07" + ; +connectAttr "maskFile_head_wm1_jawOpen.oc" "shader_head_shader.maskChannel_08"; +connectAttr "maskFile_head_wm1_purse_DL.oc" "shader_head_shader.maskChannel_09"; +connectAttr "maskFile_head_wm1_purse_DR.oc" "shader_head_shader.maskChannel_10"; +connectAttr "maskFile_head_wm1_purse_UL.oc" "shader_head_shader.maskChannel_11"; +connectAttr "maskFile_head_wm1_purse_UR.oc" "shader_head_shader.maskChannel_12"; +connectAttr "maskFile_head_wm1_squintInner_L.oc" "shader_head_shader.maskChannel_13" + ; +connectAttr "maskFile_head_wm1_squintInner_R.oc" "shader_head_shader.maskChannel_14" + ; +connectAttr "maskFile_head_wm2_browsDown_L.oc" "shader_head_shader.maskChannel_15" + ; +connectAttr "maskFile_head_wm2_browsDown_R.oc" "shader_head_shader.maskChannel_16" + ; +connectAttr "maskFile_head_wm2_browsLateral_L.oc" "shader_head_shader.maskChannel_17" + ; +connectAttr "maskFile_head_wm2_browsLateral_R.oc" "shader_head_shader.maskChannel_18" + ; +connectAttr "maskFile_head_wm2_mouthStretch_L.oc" "shader_head_shader.maskChannel_19" + ; +connectAttr "maskFile_head_wm2_mouthStretch_R.oc" "shader_head_shader.maskChannel_20" + ; +connectAttr "maskFile_head_wm2_neckStretch_L.oc" "shader_head_shader.maskChannel_21" + ; +connectAttr "maskFile_head_wm2_neckStretch_R.oc" "shader_head_shader.maskChannel_22" + ; +connectAttr "maskFile_head_wm2_noseWrinkler_L.oc" "shader_head_shader.maskChannel_23" + ; +connectAttr "maskFile_head_wm2_noseWrinkler_R.oc" "shader_head_shader.maskChannel_24" + ; +connectAttr "maskFile_head_wm3_cheekRaiseInner_L.oc" "shader_head_shader.maskChannel_25" + ; +connectAttr "maskFile_head_wm3_cheekRaiseInner_R.oc" "shader_head_shader.maskChannel_26" + ; +connectAttr "maskFile_head_wm3_cheekRaiseOuter_L.oc" "shader_head_shader.maskChannel_27" + ; +connectAttr "maskFile_head_wm3_cheekRaiseOuter_R.oc" "shader_head_shader.maskChannel_28" + ; +connectAttr "maskFile_head_wm3_cheekRaiseUpper_L.oc" "shader_head_shader.maskChannel_29" + ; +connectAttr "maskFile_head_wm3_cheekRaiseUpper_R.oc" "shader_head_shader.maskChannel_30" + ; +connectAttr "maskFile_head_wm3_smile_L.oc" "shader_head_shader.maskChannel_31"; +connectAttr "maskFile_head_wm3_smile_R.oc" "shader_head_shader.maskChannel_32"; +connectAttr "maskFile_head_wm13_lips_DL.oc" "shader_head_shader.maskChannel_33"; +connectAttr "maskFile_head_wm13_lips_DR.oc" "shader_head_shader.maskChannel_34"; +connectAttr "maskFile_head_wm13_lips_UL.oc" "shader_head_shader.maskChannel_35"; +connectAttr "maskFile_head_wm13_lips_UR.oc" "shader_head_shader.maskChannel_36"; +connectAttr "shader_head_shader.oc" "shader_head_shaderSG.ss"; +connectAttr "shader_head_shaderSG.msg" "materialInfo1.sg"; +connectAttr "shader_head_shader.msg" "materialInfo1.m"; +connectAttr "baseMapFile_dx11_diffuseIrradiance.oc" "shader_teeth_shader.DiffuseCubeIBL" + ; +connectAttr "baseMapFile_dx11_specularIrradiance.oc" "shader_teeth_shader.SpecularCubeIBL" + ; +connectAttr "baseMapFile_dx11_jitter.oc" "shader_teeth_shader.DitherTexture"; +connectAttr "baseMapFile_dx11_skinLUT.oc" "shader_teeth_shader.LutTexture"; +connectAttr "baseMapFile_teeth_color.oc" "shader_teeth_shader.DiffuseTexture"; +connectAttr "baseMapFile_teeth_normal.oc" "shader_teeth_shader.NormalTexture"; +connectAttr "shader_teeth_shader.oc" "shader_teeth_shaderSG.ss"; +connectAttr "shader_teeth_shaderSG.msg" "materialInfo2.sg"; +connectAttr "shader_teeth_shader.msg" "materialInfo2.m"; +connectAttr "shader_saliva_shader.oc" "shader_saliva_shaderSG.ss"; +connectAttr "shader_saliva_shaderSG.msg" "materialInfo3.sg"; +connectAttr "shader_saliva_shader.msg" "materialInfo3.m"; +connectAttr "baseMapFile_dx11_diffuseIrradiance.oc" "shader_eyeLeft_shader.DiffuseCubeIBL" + ; +connectAttr "baseMapFile_dx11_specularIrradiance.oc" "shader_eyeLeft_shader.SpecularCubeIBL" + ; +connectAttr "baseMapFile_dx11_jitter.oc" "shader_eyeLeft_shader.DitherTexture"; +connectAttr "baseMapFile_dx11_skinLUT.oc" "shader_eyeLeft_shader.LutTexture"; +connectAttr "baseMapFile_eyes_color.oc" "shader_eyeLeft_shader.DiffuseTexture"; +connectAttr "baseMapFile_eyes_normal.oc" "shader_eyeLeft_shader.NormalTexture"; +connectAttr "shader_eyeLeft_shader.oc" "shader_eyeLeft_shaderSG.ss"; +connectAttr "shader_eyeLeft_shaderSG.msg" "materialInfo4.sg"; +connectAttr "shader_eyeLeft_shader.msg" "materialInfo4.m"; +connectAttr "baseMapFile_dx11_diffuseIrradiance.oc" "shader_eyeRight_shader.DiffuseCubeIBL" + ; +connectAttr "baseMapFile_dx11_specularIrradiance.oc" "shader_eyeRight_shader.SpecularCubeIBL" + ; +connectAttr "baseMapFile_dx11_jitter.oc" "shader_eyeRight_shader.DitherTexture"; +connectAttr "baseMapFile_dx11_skinLUT.oc" "shader_eyeRight_shader.LutTexture"; +connectAttr "baseMapFile_eyes_color.oc" "shader_eyeRight_shader.DiffuseTexture"; +connectAttr "baseMapFile_eyes_normal.oc" "shader_eyeRight_shader.NormalTexture"; +connectAttr "shader_eyeRight_shader.oc" "shader_eyeRight_shaderSG.ss"; +connectAttr "shader_eyeRight_shaderSG.msg" "materialInfo5.sg"; +connectAttr "shader_eyeRight_shader.msg" "materialInfo5.m"; +connectAttr "shader_eyeshell_shader.oc" "shader_eyeshell_shaderSG.ss"; +connectAttr "shader_eyeshell_shaderSG.msg" "materialInfo6.sg"; +connectAttr "shader_eyeshell_shader.msg" "materialInfo6.m"; +connectAttr "baseMapFile_eyelashes_color.oc" "shader_eyelashes_shader.c"; +connectAttr "baseMapFile_eyelashes_color.ot" "shader_eyelashes_shader.it"; +connectAttr "shader_eyelashes_shader.oc" "shader_eyelashes_shaderSG.ss"; +connectAttr "shader_eyelashes_shaderSG.msg" "materialInfo7.sg"; +connectAttr "shader_eyelashes_shader.msg" "materialInfo7.m"; +connectAttr "baseMapFile_eyelashes_color.msg" "materialInfo7.t" -na; +connectAttr "shader_eyelashesShadow_shader.oc" "shader_eyelashesShadow_shaderSG.ss" + ; +connectAttr "shader_eyelashesShadow_shaderSG.msg" "materialInfo8.sg"; +connectAttr "shader_eyelashesShadow_shader.msg" "materialInfo8.m"; +connectAttr "shader_eyeEdge_shader.oc" "shader_eyeEdge_shaderSG.ss"; +connectAttr "shader_eyeEdge_shaderSG.msg" "materialInfo9.sg"; +connectAttr "shader_eyeEdge_shader.msg" "materialInfo9.m"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_dx11_diffuseIrradiance.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_dx11_diffuseIrradiance.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_dx11_diffuseIrradiance.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_dx11_diffuseIrradiance.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_dx11_specularIrradiance.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_dx11_specularIrradiance.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_dx11_specularIrradiance.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_dx11_specularIrradiance.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_dx11_jitter.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_dx11_jitter.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_dx11_jitter.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_dx11_jitter.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_dx11_skinLUT.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_dx11_skinLUT.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_dx11_skinLUT.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_dx11_skinLUT.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_head_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_head_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_head_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_head_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_cm1_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_cm1_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_cm1_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_cm1_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_cm2_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_cm2_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_cm2_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_cm2_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_cm3_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_cm3_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_cm3_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_cm3_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_head_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_head_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_head_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_head_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_wm1_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_wm1_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_wm1_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_wm1_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_wm2_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_wm2_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_wm2_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_wm2_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "mapFile_head_wm3_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "mapFile_head_wm3_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "mapFile_head_wm3_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "mapFile_head_wm3_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_head_cavity.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_head_cavity.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_head_cavity.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_head_cavity.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_blink_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_blink_L.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_blink_L.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_blink_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_blink_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_blink_R.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_blink_R.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_blink_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_browsRaiseInner_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_browsRaiseInner_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_browsRaiseInner_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_browsRaiseInner_L.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_browsRaiseInner_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_browsRaiseInner_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_browsRaiseInner_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_browsRaiseInner_R.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_browsRaiseOuter_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_browsRaiseOuter_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_browsRaiseOuter_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_browsRaiseOuter_L.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_browsRaiseOuter_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_browsRaiseOuter_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_browsRaiseOuter_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_browsRaiseOuter_R.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_chinRaise_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_chinRaise_L.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_chinRaise_L.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_chinRaise_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_chinRaise_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_chinRaise_R.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_chinRaise_R.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_chinRaise_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_jawOpen.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_jawOpen.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_jawOpen.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_jawOpen.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_purse_DL.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_purse_DL.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_purse_DL.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_purse_DL.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_purse_DR.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_purse_DR.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_purse_DR.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_purse_DR.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_purse_UL.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_purse_UL.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_purse_UL.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_purse_UL.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_purse_UR.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_purse_UR.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_purse_UR.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_purse_UR.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_squintInner_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_squintInner_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_squintInner_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_squintInner_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm1_squintInner_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm1_squintInner_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm1_squintInner_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm1_squintInner_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_browsDown_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_browsDown_L.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_browsDown_L.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_browsDown_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_browsDown_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_browsDown_R.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_browsDown_R.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_browsDown_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_browsLateral_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_browsLateral_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_browsLateral_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_browsLateral_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_browsLateral_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_browsLateral_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_browsLateral_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_browsLateral_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_mouthStretch_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_mouthStretch_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_mouthStretch_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_mouthStretch_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_mouthStretch_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_mouthStretch_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_mouthStretch_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_mouthStretch_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_neckStretch_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_neckStretch_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_neckStretch_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_neckStretch_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_neckStretch_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_neckStretch_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_neckStretch_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_neckStretch_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_noseWrinkler_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_noseWrinkler_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_noseWrinkler_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_noseWrinkler_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm2_noseWrinkler_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm2_noseWrinkler_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm2_noseWrinkler_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm2_noseWrinkler_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseInner_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseInner_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseInner_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseInner_L.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseInner_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseInner_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseInner_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseInner_R.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseOuter_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseOuter_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseOuter_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseOuter_L.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseOuter_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseOuter_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseOuter_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseOuter_R.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseUpper_L.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseUpper_L.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseUpper_L.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseUpper_L.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_cheekRaiseUpper_R.cme" + ; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_cheekRaiseUpper_R.cmcf" + ; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_cheekRaiseUpper_R.cmcp" + ; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_cheekRaiseUpper_R.ws" + ; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_smile_L.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_smile_L.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_smile_L.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_smile_L.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm3_smile_R.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm3_smile_R.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm3_smile_R.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm3_smile_R.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm13_lips_DL.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm13_lips_DL.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm13_lips_DL.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm13_lips_DL.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm13_lips_DR.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm13_lips_DR.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm13_lips_DR.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm13_lips_DR.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm13_lips_UL.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm13_lips_UL.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm13_lips_UL.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm13_lips_UL.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "maskFile_head_wm13_lips_UR.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "maskFile_head_wm13_lips_UR.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "maskFile_head_wm13_lips_UR.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "maskFile_head_wm13_lips_UR.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_teeth_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_teeth_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_teeth_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_teeth_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_teeth_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_teeth_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_teeth_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_teeth_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_eyes_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_eyes_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_eyes_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_eyes_color.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_eyes_normal.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_eyes_normal.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_eyes_normal.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_eyes_normal.ws"; +connectAttr ":defaultColorMgtGlobals.cme" "baseMapFile_eyelashes_color.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "baseMapFile_eyelashes_color.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "baseMapFile_eyelashes_color.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "baseMapFile_eyelashes_color.ws"; +connectAttr "shader_eyelashes_shader.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo12.tgi[0].ni[0].dn" + ; +connectAttr "baseMapFile_eyelashes_color.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo12.tgi[0].ni[1].dn" + ; +connectAttr "shader_eyelashes_shaderSG.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo12.tgi[0].ni[2].dn" + ; +connectAttr "shader_head_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_teeth_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_saliva_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyeLeft_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyeRight_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyeshell_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyelashes_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyelashesShadow_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_eyeEdge_shaderSG.pa" ":renderPartition.st" -na; +connectAttr "shader_head_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_teeth_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_saliva_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyeLeft_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyeRight_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyeshell_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyelashes_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyelashesShadow_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "shader_eyeEdge_shader.msg" ":defaultShaderList1.s" -na; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "baseMapFile_dx11_diffuseIrradiance.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "baseMapFile_dx11_specularIrradiance.msg" ":defaultTextureList1.tx" + -na; +connectAttr "baseMapFile_dx11_jitter.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_dx11_skinLUT.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_head_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_cm1_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_cm2_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_cm3_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_head_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_wm1_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_wm2_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "mapFile_head_wm3_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_head_cavity.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_blink_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_blink_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_browsRaiseInner_L.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm1_browsRaiseInner_R.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm1_browsRaiseOuter_L.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm1_browsRaiseOuter_R.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm1_chinRaise_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_chinRaise_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_jawOpen.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_purse_DL.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_purse_DR.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_purse_UL.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_purse_UR.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_squintInner_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm1_squintInner_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm2_browsDown_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm2_browsDown_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm2_browsLateral_L.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm2_browsLateral_R.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm2_mouthStretch_L.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm2_mouthStretch_R.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm2_neckStretch_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm2_neckStretch_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm2_noseWrinkler_L.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm2_noseWrinkler_R.msg" ":defaultTextureList1.tx" -na + ; +connectAttr "maskFile_head_wm3_cheekRaiseInner_L.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_cheekRaiseInner_R.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_cheekRaiseOuter_L.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_cheekRaiseOuter_R.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_cheekRaiseUpper_L.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_cheekRaiseUpper_R.msg" ":defaultTextureList1.tx" + -na; +connectAttr "maskFile_head_wm3_smile_L.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm3_smile_R.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm13_lips_DL.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm13_lips_DR.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm13_lips_UL.msg" ":defaultTextureList1.tx" -na; +connectAttr "maskFile_head_wm13_lips_UR.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_teeth_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_teeth_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_eyes_color.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_eyes_normal.msg" ":defaultTextureList1.tx" -na; +connectAttr "baseMapFile_eyelashes_color.msg" ":defaultTextureList1.tx" -na; +connectAttr ":perspShape.msg" ":defaultRenderGlobals.sc"; +connectAttr "baseMapFile_eyelashes_color.oc" ":internal_soloShader.ic"; +// End of head_shader.ma diff --git a/data/shaders/dx11_shd_body.fx b/data/shaders/dx11_shd_body.fx new file mode 100644 index 00000000..9b38d5ab --- /dev/null +++ b/data/shaders/dx11_shd_body.fx @@ -0,0 +1,4271 @@ +// Maya Skin shader made by Charles Greivelding 2014 + +//------------------------------------ +// Notes +//------------------------------------ +// Shader uses 'pre-multiplied alpha' as its render state and this Uber Shader is build to work in unison with that. +// Alternatively, in Maya, the dx11Shader node allows you to set your own render states by supplying the 'overridesDrawState' annotation in the technique +// You may find it harder to get proper transparency sorting if you choose to do so. + +// The technique annotation 'isTransparent' is used to tell Maya how treat the technique with respect to transparency. +// - If set to 0 the technique is always considered opaque +// - If set to 1 the technique is always considered transparent +// - If set to 2 the plugin will check if the parameter marked with the OPACITY semantic is less than 1.0 +// - If set to 3 the plugin will use the transparencyTest annotation to create a MEL procedure to perform the desired test. +// Maya will then render the object twice. Front faces follow by back faces. + +// For some objects you may need to switch the Transparency Algorithm to 'Depth Peeling' to avoid transparency issues. +// Models that require this usually have internal faces. + +//------------------------------------ +// Defines +//------------------------------------ +// how many mip map levels should Maya generate or load per texture. +// 0 means all possible levels +// some textures may override this value, but most textures will follow whatever we have defined here +// If you wish to optimize performance (at the cost of reduced quality), you can set NumberOfMipMaps below to 1 + +#define NumberOfMipMaps 0 +#define PI 3.1415926 +#define _3DSMAX_SPIN_MAX 99999 + +#ifndef _MAYA_ +#define _3DSMAX_ // at time of writing this shader, Nitrous driver did not have the _3DSMAX_ define set +#define _ZUP_ // Maya is Y up, 3dsMax is Z up +#endif + +#ifdef _MAYA_ +#define _SUPPORTTESSELLATION_ // at time of writing this shader, 3dsMax did not support tessellation +#endif + +//------------------------------------ +// State +//------------------------------------ +#ifdef _MAYA_ +RasterizerState WireframeCullFront { + CullMode = Front; + FillMode = WIREFRAME; +}; + +BlendState PMAlphaBlending { + AlphaToCoverageEnable = FALSE; + BlendEnable[0] = TRUE; + SrcBlend = ONE; + DestBlend = INV_SRC_ALPHA; + BlendOp = ADD; + SrcBlendAlpha = ONE; // Required for hardware frame render alpha channel + DestBlendAlpha = INV_SRC_ALPHA; + BlendOpAlpha = ADD; + RenderTargetWriteMask[0] = 0x0F; +}; +#endif + +//------------------------------------ +// Map Channels +//------------------------------------ +#ifdef _3DSMAX_ +int texcoord0 : Texcoord < + int Texcoord = 0; + int MapChannel = 1; + string UIWidget = "None"; +>; + +int texcoord1 : Texcoord < + int Texcoord = 1; + int MapChannel = 2; + string UIWidget = "None"; +>; + +int texcoord2 : Texcoord < + int Texcoord = 2; + int MapChannel = 3; + string UIWidget = "None"; +>; +#endif + +//------------------------------------ +// Samplers +//------------------------------------ +SamplerState CubeMapSampler { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; +}; + +SamplerState SamplerAnisoWrap { + Filter = ANISOTROPIC; + AddressU = Wrap; + AddressV = Wrap; +}; + +SamplerState SamplerAnisoClamp { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; +}; + +SamplerState SamplerShadowDepth { + Filter = MIN_MAG_MIP_POINT; + AddressU = Border; + AddressV = Border; + BorderColor = float4(1.0f, 1.0f, 1.0f, 1.0f); +}; + +//------------------------------------ +// Textures +//------------------------------------ + +Texture2D LutTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS LUT Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +Texture2D DitherTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Dither Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +// --------------------------------------------- +// Blend GROUP +// --------------------------------------------- + +bool UseBlendTexture < + string UIGroup = "Wrinkle mixing"; + string UIName = "Enable Wrinkle Mixing"; + int UIOrder = 919; +> = false; + +Texture2D animNormalMap_00 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 00"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 948; + int UVEditorOrder = 2; +>; + +Texture2D animNormalMap_01 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 01"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 949; + int UVEditorOrder = 2; +>; + +Texture2D animNormalMap_02 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 02"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 950; + int UVEditorOrder = 2; +>; + + +Texture2D animColorMap_00 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 00"; + string ResourceType = "2D"; + int UIOrder = 951; + int UVEditorOrder = 2; +>; + +Texture2D animColorMap_01 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 01"; + string ResourceType = "2D"; + int UIOrder = 952; + int UVEditorOrder = 2; +>; + +Texture2D animColorMap_02 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 02"; + string ResourceType = "2D"; + int UIOrder = 953; + int UVEditorOrder = 2; +>; + + +Texture2D maskChannel_00 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 00 Mask"; + string ResourceType = "2D"; + int UIOrder = 948; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_01 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 01 Mask"; + string ResourceType = "2D"; + int UIOrder = 949; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_02 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 02 Mask"; + string ResourceType = "2D"; + int UIOrder = 950; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_03 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 03 Mask"; + string ResourceType = "2D"; + int UIOrder = 951; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_04 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 04 Mask"; + string ResourceType = "2D"; + int UIOrder = 952; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_05 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 05 Mask"; + string ResourceType = "2D"; + int UIOrder = 953; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_06 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 06 Mask"; + string ResourceType = "2D"; + int UIOrder = 954; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_07 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 07 Mask"; + string ResourceType = "2D"; + int UIOrder = 955; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_08 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 08 Mask"; + string ResourceType = "2D"; + int UIOrder = 956; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_09 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 09 Mask"; + string ResourceType = "2D"; + int UIOrder = 957; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_10 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 10 Mask"; + string ResourceType = "2D"; + int UIOrder = 958; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_11 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 11 Mask"; + string ResourceType = "2D"; + int UIOrder = 959; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_12 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 12 Mask"; + string ResourceType = "2D"; + int UIOrder = 960; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_13 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 13 Mask"; + string ResourceType = "2D"; + int UIOrder = 961; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_14 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 14 Mask"; + string ResourceType = "2D"; + int UIOrder = 962; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_15 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 15 Mask"; + string ResourceType = "2D"; + int UIOrder = 963; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_16 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 16 Mask"; + string ResourceType = "2D"; + int UIOrder = 964; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_17 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 17 Mask"; + string ResourceType = "2D"; + int UIOrder = 965; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_18 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 18 Mask"; + string ResourceType = "2D"; + int UIOrder = 966; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_19 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 19 Mask"; + string ResourceType = "2D"; + int UIOrder = 967; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_20 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 20 Mask"; + string ResourceType = "2D"; + int UIOrder = 968; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_21 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 21 Mask"; + string ResourceType = "2D"; + int UIOrder = 969; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_22 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 22 Mask"; + string ResourceType = "2D"; + int UIOrder = 970; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_23 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 23 Mask"; + string ResourceType = "2D"; + int UIOrder = 971; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_24 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 24 Mask"; + string ResourceType = "2D"; + int UIOrder = 972; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_25 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 25 Mask"; + string ResourceType = "2D"; + int UIOrder = 973; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_26 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 26 Mask"; + string ResourceType = "2D"; + int UIOrder = 974; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_27 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 27 Mask"; + string ResourceType = "2D"; + int UIOrder = 975; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_28 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 28 Mask"; + string ResourceType = "2D"; + int UIOrder = 976; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_29 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 29 Mask"; + string ResourceType = "2D"; + int UIOrder = 977; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_30 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 30 Mask"; + string ResourceType = "2D"; + int UIOrder = 978; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_31 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 31 Mask"; + string ResourceType = "2D"; + int UIOrder = 979; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_32 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 32 Mask"; + string ResourceType = "2D"; + int UIOrder = 980; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_33 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 33 Mask"; + string ResourceType = "2D"; + int UIOrder = 981; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_34 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 34 Mask"; + string ResourceType = "2D"; + int UIOrder = 982; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_35 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 35 Mask"; + string ResourceType = "2D"; + int UIOrder = 983; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_36 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 36 Mask"; + string ResourceType = "2D"; + int UIOrder = 984; + int UVEditorOrder = 2; +>; + + +float maskWeight_00 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 00 Multiplier"; + float UIStep = 0.01; + int UIOrder = 954; +> = 0.0; + +float maskWeight_01 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 01 Multiplier"; + float UIStep = 0.01; + int UIOrder = 955; +> = 0.0; + +float maskWeight_02 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 02 Multiplier"; + float UIStep = 0.01; + int UIOrder = 956; +> = 0.0; + +float maskWeight_03 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 03 Multiplier"; + float UIStep = 0.01; + int UIOrder = 957; +> = 0.0; + +float maskWeight_04 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 04 Multiplier"; + float UIStep = 0.01; + int UIOrder = 958; +> = 0.0; + +float maskWeight_05 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 05 Multiplier"; + float UIStep = 0.01; + int UIOrder = 959; +> = 0.0; + +float maskWeight_06 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 06 Multiplier"; + float UIStep = 0.01; + int UIOrder = 960; +> = 0.0; + +float maskWeight_07 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 07 Multiplier"; + float UIStep = 0.01; + int UIOrder = 961; +> = 0.0; + +float maskWeight_08 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 08 Multiplier"; + float UIStep = 0.01; + int UIOrder = 962; +> = 0.0; + +float maskWeight_09 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 09 Multiplier"; + float UIStep = 0.01; + int UIOrder = 963; +> = 0.0; + +float maskWeight_10 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 10 Multiplier"; + float UIStep = 0.01; + int UIOrder = 964; +> = 0.0; + +float maskWeight_11 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 11 Multiplier"; + float UIStep = 0.01; + int UIOrder = 965; +> = 0.0; + +float maskWeight_12 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 12 Multiplier"; + float UIStep = 0.01; + int UIOrder = 966; +> = 0.0; + +float maskWeight_13 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 13 Multiplier"; + float UIStep = 0.01; + int UIOrder = 967; +> = 0.0; + +float maskWeight_14 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 14 Multiplier"; + float UIStep = 0.01; + int UIOrder = 968; +> = 0.0; + +float maskWeight_15 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 15 Multiplier"; + float UIStep = 0.01; + int UIOrder = 969; +> = 0.0; + +float maskWeight_16 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 16 Multiplier"; + float UIStep = 0.01; + int UIOrder = 970; +> = 0.0; + +float maskWeight_17 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 17 Multiplier"; + float UIStep = 0.01; + int UIOrder = 971; +> = 0.0; + +float maskWeight_18 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 18 Multiplier"; + float UIStep = 0.01; + int UIOrder = 972; +> = 0.0; + +float maskWeight_19 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 19 Multiplier"; + float UIStep = 0.01; + int UIOrder = 973; +> = 0.0; + +float maskWeight_20 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 20 Multiplier"; + float UIStep = 0.01; + int UIOrder = 974; +> = 0.0; + +float maskWeight_21 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 21 Multiplier"; + float UIStep = 0.01; + int UIOrder = 975; +> = 0.0; + +float maskWeight_22 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 22 Multiplier"; + float UIStep = 0.01; + int UIOrder = 976; +> = 0.0; + +float maskWeight_23 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 23 Multiplier"; + float UIStep = 0.01; + int UIOrder = 977; +> = 0.0; + +float maskWeight_24 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 24 Multiplier"; + float UIStep = 0.01; + int UIOrder = 978; +> = 0.0; + +float maskWeight_25 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 25 Multiplier"; + float UIStep = 0.01; + int UIOrder = 979; +> = 0.0; + +float maskWeight_26 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 26 Multiplier"; + float UIStep = 0.01; + int UIOrder = 980; +> = 0.0; + +float maskWeight_27 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 27 Multiplier"; + float UIStep = 0.01; + int UIOrder = 981; +> = 0.0; + +float maskWeight_28 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 28 Multiplier"; + float UIStep = 0.01; + int UIOrder = 982; +> = 0.0; + +float maskWeight_29 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 29 Multiplier"; + float UIStep = 0.01; + int UIOrder = 983; +> = 0.0; + +float maskWeight_30 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 30 Multiplier"; + float UIStep = 0.01; + int UIOrder = 984; +> = 0.0; + +float maskWeight_31 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 31 Multiplier"; + float UIStep = 0.01; + int UIOrder = 985; +> = 0.0; + +float maskWeight_32 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 32 Multiplier"; + float UIStep = 0.01; + int UIOrder = 986; +> = 0.0; + +float maskWeight_33 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 33 Multiplier"; + float UIStep = 0.01; + int UIOrder = 987; +> = 0.0; + +float maskWeight_34 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 34 Multiplier"; + float UIStep = 0.01; + int UIOrder = 988; +> = 0.0; + +float maskWeight_35 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 35 Multiplier"; + float UIStep = 0.01; + int UIOrder = 989; +> = 0.0; + +float maskWeight_36 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 36 Multiplier"; + float UIStep = 0.01; + int UIOrder = 990; +> = 0.0; + +float maskWeight_37 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 37 Multiplier"; + float UIStep = 0.01; + int UIOrder = 991; +> = 0.0; + +float maskWeight_38 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 38 Multiplier"; + float UIStep = 0.01; + int UIOrder = 992; +> = 0.0; + +float maskWeight_39 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 39 Multiplier"; + float UIStep = 0.01; + int UIOrder = 993; +> = 0.0; + +float maskWeight_40 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 40 Multiplier"; + float UIStep = 0.01; + int UIOrder = 994; +> = 0.0; + +float maskWeight_41 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 41 Multiplier"; + float UIStep = 0.01; + int UIOrder = 995; +> = 0.0; + +float maskWeight_42 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 42 Multiplier"; + float UIStep = 0.01; + int UIOrder = 996; +> = 0.0; + +float maskWeight_43 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 43 Multiplier"; + float UIStep = 0.01; + int UIOrder = 997; +> = 0.0; + +float maskWeight_44 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 44 Multiplier"; + float UIStep = 0.01; + int UIOrder = 998; +> = 0.0; + +float maskWeight_45 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 45 Multiplier"; + float UIStep = 0.01; + int UIOrder = 999; +> = 0.0; + +float maskWeight_46 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 46 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1000; +> = 0.0; + +float maskWeight_47 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 47 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1001; +> = 0.0; + +float maskWeight_48 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 48 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1002; +> = 0.0; + +float maskWeight_49 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 49 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1003; +> = 0.0; + +float maskWeight_50 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 50 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1004; +> = 0.0; + +float maskWeight_51 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 51 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1005; +> = 0.0; + +float maskWeight_52 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 52 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1006; +> = 0.0; + +float maskWeight_53 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 53 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1007; +> = 0.0; + +float maskWeight_54 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 54 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1008; +> = 0.0; + +float maskWeight_55 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 55 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1009; +> = 0.0; + +float maskWeight_56 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 56 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1010; +> = 0.0; + +float maskWeight_57 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 57 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1011; +> = 0.0; + +float maskWeight_58 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 58 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1012; +> = 0.0; + +float maskWeight_59 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 59 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1013; +> = 0.0; + +float maskWeight_60 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 60 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1014; +> = 0.0; + +float maskWeight_61 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 61 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1015; +> = 0.0; + +float maskWeight_62 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 62 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1016; +> = 0.0; + +float maskWeight_63 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 63 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1017; +> = 0.0; + +float maskWeight_64 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 64 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1018; +> = 0.0; + +float maskWeight_65 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 65 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1019; +> = 0.0; + +float maskWeight_66 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 66 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1020; +> = 0.0; + +float maskWeight_67 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 67 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1021; +> = 0.0; + +float maskWeight_68 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 68 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1022; +> = 0.0; + +float maskWeight_69 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 69 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1023; +> = 0.0; + +float maskWeight_70 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 70 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1024; +> = 0.0; + +float maskWeight_71 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 71 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1025; +> = 0.0; + +float maskWeight_72 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 72 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1026; +> = 0.0; + +float maskWeight_73 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 73 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1027; +> = 0.0; + +float maskWeight_74 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 74 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1028; +> = 0.0; + +float maskWeight_75 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 75 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1029; +> = 0.0; + +float maskWeight_76 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 76 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1030; +> = 0.0; + +float maskWeight_77 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 77 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1031; +> = 0.0; + +float maskWeight_78 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 78 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1032; +> = 0.0; + +float maskWeight_79 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 79 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1033; +> = 0.0; + +float maskWeight_80 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 80 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1034; +> = 0.0; + +float maskWeight_81 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 81 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1035; +> = 0.0; + + + +Texture2D OcclusionTexture < + string UIGroup = "Occlusion"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Ambient Occlusion Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 401; + int UVEditorOrder = 2; +>; + +Texture2D ScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Radius Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 209; + int UVEditorOrder = 2; +>; + +Texture2D CavityTexture < + string UIGroup = "Cavity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 501; + int UVEditorOrder = 4; +>; + +Texture2D DiffuseTexture < + string UIGroup = "Diffuse"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 201; + int UVEditorOrder = 1; +>; + +Texture2D SpecularTexture < + string UIGroup = "Specular"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 302; + int UVEditorOrder = 4; +>; + +Texture2D NormalTexture < + string UIGroup = "Normal"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; // If mip maps exist in texture, Maya will load them. So user can pre-calculate and re-normalize mip maps for normal maps in .dds + int UIOrder = 601; + int UVEditorOrder = 5; +>; + +Texture2D MicroCavityTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 701; + int UVEditorOrder = 5; +>; + +Texture2D MicroNormalTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 704; + int UVEditorOrder = 5; +>; + +#ifdef _SUPPORTTESSELLATION_ +Texture2D DisplacementTexture < + string UIGroup = "Tessellation and Displacement"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Displacement Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 902; + int UVEditorOrder = 8; +>; +#endif + +Texture2D BackScatteringThicknessTexture < + string UIGroup = "BackScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Thickness Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 215; + int UVEditorOrder = 10; +>; + +Texture2D OpacityMaskTexture < + string UIGroup = "Opacity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Opacity Mask"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 800; + int UVEditorOrder = 12; +>; + +TextureCube DiffuseCubeIBL < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; // Use (or load) max number of mip map levels so we can use blurring + int UIOrder = 108; + int UVEditorOrder = 10; +>; + +TextureCube SpecularCubeIBL : environment < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; + int UIOrder = 111; + int UVEditorOrder = 6; +>; + +//------------------------------------ +// Shadow Maps +//------------------------------------ +Texture2D light0ShadowMap : SHADOWMAP < + string Object = "Light 0"; // UI Group for lights, auto-closed + string UIWidget = "None"; + int UIOrder = 5010; +>; + +Texture2D light1ShadowMap : SHADOWMAP < + string Object = "Light 1"; + string UIWidget = "None"; + int UIOrder = 5020; +>; + +Texture2D light2ShadowMap : SHADOWMAP < + string Object = "Light 2"; + string UIWidget = "None"; + int UIOrder = 5030; +>; + +//------------------------------------ +// Internal depth textures for Maya depth-peeling transparency +//------------------------------------ +#ifdef _MAYA_ + +Texture2D transpDepthTexture : transpdepthtexture < + string UIWidget = "None"; +>; + +Texture2D opaqueDepthTexture : opaquedepthtexture < + string UIWidget = "None"; +>; + +#endif + +//------------------------------------ +// Per Frame parameters +//------------------------------------ +cbuffer UpdatePerFrame : register(b0) { + float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; + float4x4 view : View < string UIWidget = "None"; >; + float4x4 prj : Projection < string UIWidget = "None"; >; + float4x4 viewPrj : ViewProjection < string UIWidget = "None"; >; + + // A shader may wish to do different actions when Maya is rendering the preview swatch (e.g. disable displacement) + // This value will be true if Maya is rendering the swatch + bool IsSwatchRender : MayaSwatchRender < string UIWidget = "None"; > = false; + float2 screenSize : ViewportPixelSize < string UIWidget = "None"; >; + + // If the user enables viewport gamma correction in Maya's global viewport rendering settings, the shader should not do gamma again + bool MayaFullScreenGamma : MayaGammaCorrection < string UIWidget = "None"; > = false; +} + + +//------------------------------------ +// Per Object parameters +//------------------------------------ +cbuffer UpdatePerObject : register(b1) { + float4x4 world : World < string UIWidget = "None"; >; + float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; +#ifndef _SUPPORTTESSELLATION_ + float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; +#endif + +// --------------------------------------------- +// Lighting Settings GROUP +// --------------------------------------------- +bool LinearSpaceLighting < + string UIGroup = "Lighting Settings"; + string UIName = "Linear Space Lighting"; + int UIOrder = 100; +> = true; + +bool UseShadows < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIName = "Shadows"; + int UIOrder = 101; +#endif +> = true; + +float shadowMultiplier < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UIMax = 1.000; + float UIStep = 0.001; + string UIName = "Shadow Strength"; + int UIOrder = 102; +#endif +> = { 1.0f }; + +// This offset allows you to fix any in-correct self shadowing caused by limited precision. +// This tends to get affected by scene scale and polygon count of the objects involved. +float shadowDepthBias : ShadowMapBias < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UISoftMax = 10.000; + float UIStep = 0.001; + string UIName = "Shadow Bias"; + int UIOrder = 103; +#endif +> = { 0.01f }; + +// flips back facing normals to improve lighting for things like sheets of hair or leaves +bool flipBackfaceNormals < + string UIGroup = "Lighting Settings"; + string UIName = "Double Sided Lighting"; + int UIOrder = 104; +> = true; + +// -- light props are inserted here via UIOrder 20 - 49 + +// --------------------------------------------- +// IBL Settings GROUP +// --------------------------------------------- + +float SkyRotation < + string UIGroup = "IBL Settings"; + string UIName = "Sky Rotation"; + float UISoftMin = 0; + float UISoftMax = 360; + float UIMin = 0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1; + int UIOrder = 105; + string UIWidget = "Slider"; +> = { 0.0f }; + +bool UseDiffuseIBLMap < + string UIGroup = "IBL Settings"; + string UIName = "Use Diffuse Cubemap"; + int UIOrder = 106; +> = false; + +float DiffuseIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Diffuse IBL Intensity"; + int UIOrder = 107; +> = 1.0; + +bool UseSpecCubeIBL < + string UIGroup = "IBL Settings"; + string UIName = "Use Specular Cubemap"; + int UIOrder = 109; +> = false; + +float SpecularIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Specular IBL Intensity"; + int UIOrder = 110; +> = 1.0; + +// --------------------------------------------- +// Diffuse GROUP +// --------------------------------------------- + +bool UseDiffuseTexture < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map"; + int UIOrder = 200; +> = false; + + +bool UseDiffuseTextureAlpha < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map Alpha"; + int UIOrder = 201; +> = false; + +float3 DiffuseColor : Diffuse < + string UIGroup = "Diffuse"; + string UIName = "Diffuse Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 202; +> = { 1.0f, 1.0f, 1.0f }; + +// --------------------------------------------- +// SSS GROUP +// --------------------------------------------- + +float skinCoeffX < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient R"; + int UIOrder = 204; +> = 1.0; + +float skinCoeffY < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient G"; + int UIOrder = 205; +> = 0.5; + +float skinCoeffZ < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient B"; + int UIOrder = 206; +> = 0.25; + +float NormalBlurring < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Softness"; + int UIOrder = 207; +> = 0.25; + +bool UseScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string UIName = "Use SSS Radius Map"; + int UIOrder = 209; +> = false; + +float skinScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Radius"; + int UIOrder = 210; +> = 0.25; + +float shadowBlur < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Blur"; + int UIOrder = 211; +> = 1.0; + +float shadowDither < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Dither"; + int UIOrder = 211; +> = 1.0; + +float shadowScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Scattering"; + int UIOrder = 212; +> = 1.0; + +float shadowSaturation < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 4.0; + float UIMax = 4; + float UIStep = 0.1; + string UIName = "SSS Shadow Saturation"; + int UIOrder = 213; +> = 1.0; + +// --------------------------------------------- +// BackScattering GROUP +// --------------------------------------------- + +bool UseTranslucency < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering"; + int UIOrder = 214; +> = false; + +bool UseThicknessTexture < + string UIGroup = "BackScattering"; + string UIName = "Use Thickness Map"; + int UIOrder = 216; +> = false; + +float skinScatteringRoughness < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Width"; + int UIOrder = 217; +> = 1.0; + +/*float3 skinScatteringInnerColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Inner Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 215; +> = {0.25f, 0.05f, 0.02f };*/ + +float3 skinScatteringOuterColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 218; +> = { 0.25f, 0.05f, 0.02f }; + +float skinScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Amount"; + int UIOrder = 219; +> = 1.0; + +float skinAmbientScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Ambient Amount"; + int UIOrder = 220; +> = 1.0; + +/* float skinScatteringPlane < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Far Plane"; + int UIOrder = 218; +> = 1.0;*/ + +// --------------------------------------------- +// Specular GROUP +// --------------------------------------------- + +bool UseSpecularTexture < + string UIGroup = "Specular"; + string UIName = "Use Specular Map"; + int UIOrder = 301; +> = false; + +bool UseSpecularTextureAlpha < + string UIGroup = "Specular"; + string UIName = "Use Roughness Map Alpha"; + int UIOrder = 301; +> = false; + +float3 SpecularColor : Specular < + string UIGroup = "Specular"; + string UIName = "Specular Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 303; +> = { 1.0f, 1.0f, 1.0f }; + + +float LobeMix < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Lobe Mixing"; + int UIOrder = 304; +> = 0.75; + +float Roughness < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Roughness multiplier"; + int UIOrder = 305; +> = .2; + +// --------------------------------------------- +// Occlusion GROUP +// --------------------------------------------- + +bool UseAmbientOcclusionTexture < + string UIGroup = "Occlusion"; + string UIName = "Use Occlusion Map"; + int UIOrder = 400; +> = false; + +float OcclusionAmount < + string UIGroup = "Occlusion"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Occlusion Amount"; + int UIOrder = 402; +> = 1.0; + +// --------------------------------------------- +// Cavity GROUP +// --------------------------------------------- + +bool UseCavityTexture < + string UIGroup = "Cavity"; + string UIName = "Use Cavity Map"; + int UIOrder = 500; +> = false; + +float CavityAmount < + string UIGroup = "Cavity"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Cavity Amount"; + int UIOrder = 502; +> = 1.0; + +// --------------------------------------------- +// Normal GROUP +// --------------------------------------------- +bool UseNormalTexture < + string UIGroup = "Normal"; + string UIName = "Use Normal Map"; + int UIOrder = 600; +> = false; + +float NormalHeight < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Normal Height"; + int UIOrder = 603; +> = 1.0; + +bool SupportNonUniformScale < + string UIGroup = "Normal"; + string UIName = "Support Non-Uniform Scale"; + int UIOrder = 604; +> = true; + +int NormalCoordsysX < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal X (Red)"; + int UIOrder = 605; +> = 0; + +int NormalCoordsysY < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal Y (Green)"; + int UIOrder = 606; +> = 0; + +// --------------------------------------------- +// Micro Details GROUP +// --------------------------------------------- + +bool UseMicroCavityTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Cavity Map"; + int UIOrder = 700; +> = false; + +float MicroCavityAmount < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Cavity Amount"; + int UIOrder = 702; +> = 1.0; + +bool UseMicroNormalTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Normal Map"; + int UIOrder = 703; +> = false; + +float MicroNormalHeight < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Normal Height"; + int UIOrder = 705; +> = 1.0; + +float MicroScale < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 16.0; + float UISoftMax = 256.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Scale"; + int UIOrder = 706; +> = 32; + +// --------------------------------------------- +// Opacity GROUP +// --------------------------------------------- +float Opacity : OPACITY < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity"; + int UIOrder = 801; +> = 1.0; + +bool UseOpacityMaskTexture < + string UIGroup = "Opacity"; + string UIName = "Opacity Mask"; + int UIOrder = 802; +> = false; + +// at what value do we clip away pixels +float OpacityMaskBias < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity Mask Bias"; + int UIOrder = 803; +> = 0.1; + +#ifdef _SUPPORTTESSELLATION_ +// --------------------------------------------- +// Tessellation and Displacement GROUP +// --------------------------------------------- +int DisplacementModel < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Model"; + string UIFieldNames = "Grayscale:Tangent Vector"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 900; +> = false; + +bool UseDisplacementMap < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Map"; + int UIOrder = 901; +> = false; + +int VectorDisplacementCoordSys < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + string UIFieldNames = "Mudbox (XZY):Maya (XYZ)"; + string UIName = "Displacement Coordsys"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 903; +> = 0; + +float DisplacementHeight < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 10.0; + string UIName = "Displacement Height"; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + int UIOrder = 904; +> = 0.5; + +// This allows you to control what the 'base' value for displacement is. +// When the offset value is 0.5, that means that a gray value (color: 128,128,128) will get 0 displacement. +// A value of 0 would then dent in. +// A value of 1 would then extrude. +float DisplacementOffset < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = -1.0; + float UISoftMax = 1.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + string UIName = "Displacement Offset"; + int UIOrder = 905; +> = 0.5; + +// This gives the artist control to prevent this shader from clipping away faces to quickly when displacement is actually keeping the faces on screen. +// This is also important for e.g. shadow map generation to make sure displaced vertices are not clipped out of the light's view +// See BBoxExtraScale for artist control over Maya clipping the entire object away when it thinks it leaves the view. +float DisplacementClippingBias < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 99.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Displacement Clipping Bias"; + int UIOrder = 906; +> = 5.0; + +// This gives the artist control to prevent maya from clipping away the entire object to fast in case displacement is used. +// Its semantic has to be BoundingBoxExtraScale +float BBoxExtraScale : BoundingBoxExtraScale < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Bounding Box Extra Scale"; + int UIOrder = 907; +> = 1.0; + +float TessellationRange < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 999.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1.0; + string UIName = "Tessellation Range"; + int UIOrder = 908; +> = { 0 }; + +float TessellationMin < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Tessellation Minimum"; + int UIOrder = 909; +> = 3.0; + +float FlatTessellation < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.1; + string UIName = "Flat Tessellation"; + int UIOrder = 910; +> = 0.0; +#endif + +// --------------------------------------------- +// UV assignment GROUP +// --------------------------------------------- +// Use the Surface Data Section to set your UVset names for each Texcoord. +// E.g. TexCoord1 = uv:UVset +// Then pick a Texcoord in the UV Section to use that UVset for a texture. + +int DiffuseTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Diffuse Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2002; +> = 0; + +int OcclusionTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Ambient Occlusion Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2003; +> = 1; + +int OpacityMaskTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Opacity Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2005; +> = 0; + +int SpecularTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Specular Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2006; +> = 0; + +int NormalTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Normal Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2008; +> = 0; + +#ifdef _SUPPORTTESSELLATION_ +int DisplacementTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Displacement Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2010; +> = 0; +#endif + +int ThicknessTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Translucency Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2011; +> = 0; +} //end UpdatePerObject cbuffer + +//------------------------------------ +// Light parameters +//------------------------------------ +cbuffer UpdateLights : register(b2) { +// --------------------------------------------- +// Light 0 GROUP +// --------------------------------------------- +// This value is controlled by Maya to tell us if a light should be calculated +// For example the artist may disable a light in the scene, or choose to see only the selected light +// This flag allows Maya to tell our shader not to contribute this light into the lighting +bool light0Enable : LIGHTENABLE < +string Object = "Light 0"; // UI Group for lights, auto-closed +string UIName = "Enable Light 0"; +int UIOrder = 20; +#ifdef _MAYA_ +> = false; // maya manages lights itself and defaults to no lights +#else +> = true; // in 3dsMax we should have the default light enabled +#endif + +// follows LightParameterInfo::ELightType +// spot = 2, point = 3, directional = 4, ambient = 5, +int light0Type : LIGHTTYPE < + string Object = "Light 0"; + string UIName = "Light 0 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + int UIOrder = 21; + float UIMin = 0; + float UIMax = 5; + float UIStep = 1; +> = 2; // default to spot so the cone angle etc work when "Use Shader Settings" option is used + +float3 light0Pos : POSITION < + string Object = "Light 0"; + string UIName = "Light 0 Position"; + string Space = "World"; + int UIOrder = 22; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +float3 light0Color : LIGHTCOLOR < + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Color"; + string UIWidget = "Color"; + int UIOrder = 23; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light0Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 24; +#endif +> = { 1.0f }; + +float3 light0Dir : DIRECTION < + string Object = "Light 0"; + string UIName = "Light 0 Direction"; + string Space = "World"; + int UIOrder = 25; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light0ConeAngle : HOTSPOT // In radians +#else +float light0ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 26; +#endif +> = { 0.46f }; + +#ifdef _MAYA_ +float light0FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light0FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 27; +#endif +> = { 0.7f }; + +float light0AttenScale : DECAYRATE < + string Object = "Light 0"; + string UIName = "Light 0 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 28; +> = { 0.0 }; + +bool light0ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 29; +#endif +> = true; + +float4x4 light0Matrix : SHADOWMAPMATRIX < + string Object = "Light 0"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 1 GROUP +// --------------------------------------------- +bool light1Enable : LIGHTENABLE < + string Object = "Light 1"; + string UIName = "Enable Light 1"; + int UIOrder = 30; +> = false; + +int light1Type : LIGHTTYPE < + string Object = "Light 1"; + string UIName = "Light 1 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 31; +> = 2; + +float3 light1Pos : POSITION < + string Object = "Light 1"; + string UIName = "Light 1 Position"; + string Space = "World"; + int UIOrder = 32; + int RefID = 1; // 3DSMAX +> = { -100.0f, 100.0f, 100.0f }; + +float3 light1Color : LIGHTCOLOR < + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Color"; + string UIWidget = "Color"; + int UIOrder = 33; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light1Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 34; +#endif +> = { 1.0f }; + +float3 light1Dir : DIRECTION < + string Object = "Light 1"; + string UIName = "Light 1 Direction"; + string Space = "World"; + int UIOrder = 35; + int RefID = 1; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light1ConeAngle : HOTSPOT // In radians +#else +float light1ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 36; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light1FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light1FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 37; +#endif +> = { 0.0f }; + +float light1AttenScale : DECAYRATE < + string Object = "Light 1"; + string UIName = "Light 1 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 38; +> = { 0.0 }; + +bool light1ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 39; +#endif +> = true; + +float4x4 light1Matrix : SHADOWMAPMATRIX < + string Object = "Light 1"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 2 GROUP +// --------------------------------------------- +bool light2Enable : LIGHTENABLE < + string Object = "Light 2"; + string UIName = "Enable Light 2"; + int UIOrder = 40; +> = false; + +int light2Type : LIGHTTYPE < + string Object = "Light 2"; + string UIName = "Light 2 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 41; +> = 2; + +float3 light2Pos : POSITION < + string Object = "Light 2"; + string UIName = "Light 2 Position"; + string Space = "World"; + int UIOrder = 42; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, -100.0f }; + +float3 light2Color : LIGHTCOLOR < + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Color"; + string UIWidget = "Color"; + int UIOrder = 43; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light2Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 44; +#endif +> = { 1.0f }; + +float3 light2Dir : DIRECTION < + string Object = "Light 2"; + string UIName = "Light 2 Direction"; + string Space = "World"; + int UIOrder = 45; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light2ConeAngle : HOTSPOT // In radians +#else +float light2ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 46; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light2FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light2FallOff : LIGHTFALLOFF +#endif +< +string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 47; +#endif +> = { 0.0f }; + +float light2AttenScale : DECAYRATE < + string Object = "Light 2"; + string UIName = "Light 2 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 48; +> = { 0.0 }; + +bool light2ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 49; +#endif +> = true; + +float4x4 light2Matrix : SHADOWMAPMATRIX < + string Object = "Light 2"; + string UIWidget = "None"; +>; + +} //end lights cbuffer + +//------------------------------------ +// Structs +//------------------------------------ +struct APPDATA { + float3 position : POSITION; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 normal : NORMAL; + float3 binormal : BINORMAL; + float3 tangent : TANGENT; +}; + +struct SHADERDATA { + float4 position : SV_Position; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 worldNormal : NORMAL; + float4 worldTangent : TANGENT; + float3 worldPosition : TEXCOORD3; + float4 screenCoord : TEXCOORD14; + +#ifdef _SUPPORTTESSELLATION_ + // Geometry generated control points: + // .worldPosition is CP0, so we don't need to store it again + float3 CP1 : TEXCOORD4; + float3 CP2 : TEXCOORD5; + + // PN-AEN with displacement fix: + float4 dominantEdge : TEXCOORD6; // both vertices of an edge + float2 dominantVertex : TEXCOORD7; // corner + + // Dominant normal and tangent for VDM crack fix: + // this could be compacted into less texcoords, but left as-is for readability + float3 dominantNormalE0 : TEXCOORD8; + float3 dominantNormalE1 : TEXCOORD9; + float3 dominantNormalCorner : TEXCOORD10; + + float3 dominantTangentE0 : TEXCOORD11; + float3 dominantTangentE1 : TEXCOORD12; + float3 dominantTangentCorner : TEXCOORD13; + + float clipped : CLIPPED; +#endif +}; + + +#ifdef _SUPPORTTESSELLATION_ +struct HSCONSTANTDATA { + float TessFactor[3] : SV_TessFactor; // tessellation amount for each edge of patch + float InsideTessFactor : SV_InsideTessFactor; // tessellation amount within a patch surface (would be float2 for quads) + float3 CPCenter : CENTER; // Geometry generated center control point +}; +#endif + +//------------------------------------ +// BRDF +//------------------------------------ + +float sqr(float x) { + return x*x; +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float D_Beckmann(float Roughness, float NoH) { + float m = Roughness; + float m2 = m * m; + + float NdotH2 = sqr(NoH); + return exp((NdotH2 - 1) / (m2 * NdotH2)) / (PI * m2 * NdotH2 * NdotH2); +} + +// This function is from Nvidia's Human Head demo +float D_BeckmannNVIDIA(float m, float ndoth) { + float alpha = acos(ndoth); + float ta = tan(alpha); + float val = 1.0 / (m*m*pow(ndoth, 4.0)) * exp(-(ta*ta) / (m*m)); + return val; +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_Schlick(float3 SpecularColor, float LdotH) { + return SpecularColor + (1.0f - SpecularColor) * exp2((-5.55473 * LdotH - 6.98316) * LdotH); +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2011, "Adopting a physically based shading model" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_LagardeSchlick(float3 SpecularColor, float Roughness, float NdotV) { + return SpecularColor + (max(1 - Roughness, SpecularColor) - SpecularColor) * exp2((-5.55473 * NdotV - 6.98316) * NdotV); +} + +float3 F_KelemenSzirmaykalos(float3 H, float3 V, float3 F0) { + float base = 1.0 - dot(V, H); + float exponential = pow(base, 5.0); + return exponential + F0 * (1.0 - exponential); +} + +float3 KelemenSzirmaykalos(float3 N, float3 L, float3 V, float roughness, float3 specular) { + float3 result = float3(0.0, 0.0, 0.0); + float NdotL = dot(N, L); + + if (NdotL > 0.0) { + float3 h = L + V; + float3 H = normalize(h); + float NdotH = dot(N, H); + float VdotH = dot(V, H); + float D = D_BeckmannNVIDIA(roughness, NdotH); + float3 F = F_Schlick(specular, VdotH); + float G = 1; + float3 specularDirect = max(D * G * F / dot(h, h), 0); + result = specularDirect * NdotL; // Specular is added for more tuning + } + return result; +} + +float3 PennerSkin(float3 skinCoef, float3 N, float3 L, float3 Nlow, float Curvature) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + pennerNdotL = saturate(pennerNdotL * 0.5 + 0.5); + + float3 pennerlookUp; + pennerlookUp.r = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.r, Curvature)).r; + pennerlookUp.g = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.g, Curvature)).g; + pennerlookUp.b = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.b, Curvature)).b; + + return pennerlookUp; +} + +float3 PennerSkinNoLUT(float3 skinCoef, float3 N, float3 L, float3 Nlow) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + + float3 pennerlookUp; + pennerlookUp.r = saturate(pennerNdotL.r*(float3(1, 1, 1).r - skinCoef.r) + skinCoef.r) * (1 - skinCoef.r); + pennerlookUp.g = saturate(pennerNdotL.g*(float3(1, 1, 1).g - skinCoef.g) + skinCoef.g) * (1 - skinCoef.g); + pennerlookUp.b = saturate(pennerNdotL.b*(float3(1, 1, 1).b - skinCoef.b) + skinCoef.b) * (1 - skinCoef.b); + + return pennerlookUp; +} + +float3 diffuseSkinIBL(float3 skinCoef, float3 diffuseIBL_HighFreq, float3 diffuseIBL_LowFreq) { + return lerp(diffuseIBL_HighFreq, diffuseIBL_LowFreq, skinCoef); +} + +//------------------------------------ +// Functions +//------------------------------------ + +float4 ComputeScreenPos(float4 pos) { +#if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; +#else + float scale = 1.0; +#endif + + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*scale) + o.w; + o.zw = pos.zw; + + return o; +} + +// Occlusion taking into account the color of the texture multiplied to it +float3 coloredOcclusion(float3 color, float occlusion) { + float3 coloredOcclusion = lerp(float3(1.0f, 1.0f, 1.0f), color, (1 - occlusion)); + //color *= coloredOcclusion; + return coloredOcclusion; +} + +float specularOcclusion(float3 N, float3 V, float Occlusion) { + const float specularPow = 5.0; + float NdotV = dot(N, V); + float s = saturate(-0.3 + NdotV * NdotV); + + return lerp(pow(Occlusion, specularPow), 1.0, s); +} + +float2 pickTexcoord(int index, float2 t0, float2 t1, float2 t2) { + float2 tcoord = t0; + + if (index == 1) { + tcoord = t1; + } else if (index == 2) { + tcoord = t2; + } + + return tcoord; +} + +float3 RotateVectorYaw(float3 vec, float degreeOfRotation) { + float3 rotatedVec = vec; + float angle = radians(degreeOfRotation); + + rotatedVec.x = (cos(angle) * vec.x) - (sin(angle) * vec.z); + rotatedVec.z = (sin(angle) * vec.x) + (cos(angle) * vec.z); + + return rotatedVec; +} + +// Spot light cone +float lightConeangle(float coneAngle, float coneFalloff, float3 lightVec, float3 lightDir) { + // the cone falloff should be equal or bigger then the coneAngle or the light inverts + // this is added to make manually tweaking the spot settings easier. + if (coneFalloff < coneAngle) { + coneFalloff = coneAngle; + } + + float LdotDir = dot(normalize(lightVec), lightDir); + + // cheaper cone, no fall-off control would be: + // float cone = pow(saturate(LdotDir), 1 / coneAngle); + + // higher quality cone (more expensive): + float cone = smoothstep(cos(coneFalloff), cos(coneAngle), LdotDir); + + return cone; +} + +#define SHADOW_FILTER_TAPS_CNT 10 + +float2 SuperFilterTaps[SHADOW_FILTER_TAPS_CNT] < string UIWidget = "None"; > = { + { -0.84052f, -0.073954f }, + { -0.326235f, -0.40583f }, + { -0.698464f, 0.457259f }, + { -0.203356f, 0.6205847f }, + { 0.96345f, -0.194353f }, + { 0.473434f, -0.480026f }, + { 0.519454f, 0.767034f }, + { 0.185461f, -0.8945231f }, + { 0.507351f, 0.064963f }, + { -0.321932f, 0.5954349f } +}; + +static float4 kernel[25] = { + { 0.530605, 0.613514, 0.739601, 0 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, -3 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, -2.52083 }, + { 0.00500364, 0.00020094, 5.28848e-005, -2.08333 }, + { 0.00700976, 0.00049366, 0.000151938, -1.6875 }, + { 0.0094389, 0.00139119, 0.000416598, -1.33333 }, + { 0.0128496, 0.00356329, 0.00132016, -1.02083 }, + { 0.017924, 0.00711691, 0.00347194, -0.75 }, + { 0.0263642, 0.0119715, 0.00684598, -0.520833 }, + { 0.0410172, 0.0199899, 0.0118481, -0.333333 }, + { 0.0493588, 0.0367726, 0.0219485, -0.1875 }, + { 0.0402784, 0.0657244, 0.04631, -0.0833333 }, + { 0.0211412, 0.0459286, 0.0378196, -0.0208333 }, + { 0.0211412, 0.0459286, 0.0378196, 0.0208333 }, + { 0.0402784, 0.0657244, 0.04631, 0.0833333 }, + { 0.0493588, 0.0367726, 0.0219485, 0.1875 }, + { 0.0410172, 0.0199899, 0.0118481, 0.333333 }, + { 0.0263642, 0.0119715, 0.00684598, 0.520833 }, + { 0.017924, 0.00711691, 0.00347194, 0.75 }, + { 0.0128496, 0.00356329, 0.00132016, 1.02083 }, + { 0.0094389, 0.00139119, 0.000416598, 1.33333 }, + { 0.00700976, 0.00049366, 0.000151938, 1.6875 }, + { 0.00500364, 0.00020094, 5.28848e-005, 2.08333 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, 2.52083 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, 3 } +}; + + +static float2 kernelRandom[32] = { + { 0.254395, 0.385445 }, + { -0.139177, 0.571074 }, + { -0.453510, 0.962140 }, + { 0.482684, 0.346190 }, + { 0.889741, 0.724799 }, + { -0.661047, -0.137344 }, + { -0.193311, -0.313475 }, + { 0.363177, -0.960291 }, + { -0.225866, -0.654962 }, + { 0.407875, 0.431522 }, + { -0.543008, -0.992827 }, + { -0.878493, -0.896999 }, + { -0.641776, 0.130757 }, + { -0.785279, -0.015190 }, + { 0.469054, 0.248633 }, + { -0.820410, -0.562833 }, + { 0.174019, -0.618069 }, + { -0.906449, -0.275099 }, + { -0.655285, -0.956021 }, + { 0.453776, -0.085425 }, + { -0.430788, -0.089530 }, + { -0.587370, -0.851826 }, + { 0.149056, -0.474322 }, + { 0.228684, 0.321661 }, + { -0.668752, -0.829400 }, + { -0.729554, 0.438250 }, + { -0.467018, -0.252882 }, + { 0.090398, 0.618760 }, + { 0.741840, 0.516401 }, + { -0.983891, 0.248701 }, + { -0.162010, -0.714455 }, + { 0.308825, 0.787175 } +}; + +float shadowMapTexelSize < string UIWidget = "None"; > = { 0.00195313 }; // (1.0f / 512) + +// Shadows: +// Percentage-Closer Filtering +float3 lightShadow(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size) { + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float shadowColored = 0; + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + float z = Pndc.z - shadowDepthBias / Pndc.w; + + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 32; ++i) { + float2 offset = kernelRandom[i] * shadowDepth * shadowMapTexelSize; + float2 ditherOffset = mul(offset, rotationMatrix); + ditherOffset = lerp(offset, ditherOffset, shadowDither); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + ditherOffset, 0).x; + + ditherShadow += (sample >= 0.0f) ? 0.0f : (1.0f / 32); + } + } + + return ditherShadow; +} + +float3 lightShadowSkin(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size, float2 dir) { + + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float3 shadowColored = float3(0, 0, 0); + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + + float z = Pndc.z - shadowDepthBias / Pndc.w; + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 25; ++i) { + float2 offset = kernel[i].a * dir * shadowDepth * shadowMapTexelSize; + offset = mul(offset, rotationMatrix); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + offset, 0).x; + ditherShadow = (sample >= 0.0f) ? 0.0f : 1.0f; + + shadowColored += ditherShadow * kernel[i].rgb; + } + } + + return shadowColored; +} + +#ifdef _SUPPORTTESSELLATION_ +// Pick dominant for crack free displacement (original function by Bryan Dudash, modified to support any float3) +float3 PickDominant(float3 vec, // vector to change + float U, float V, float W, // barycoords + float3 DE0A, float3 DE0B, // domimant edge 0 vertex A and B + float3 DE1A, float3 DE1B, // domimant edge 1 vertex A and B + float3 DE2A, float3 DE2B, // domimant edge 2 vertex A and B + float3 DV0, float3 DV1, float3 DV2) { // dominant corners + // Override the texture coordinates along the primitive edges and at the corners. + // Keep the original interpolated coords for the inner area of the primitive. + + float3 dominantVector = vec; + + float edgeThreshold = 0.0001f; + float edgeU = (U == 0) ? 1 : 0; + float edgeV = (V == 0) ? 1 : 0; + float edgeW = (W == 0) ? 1 : 0; + + float corner = ((edgeU + edgeV + edgeW) == 2) ? 1 : 0; // two are 0, means we are a corner + float edge = ((edgeU + edgeV + edgeW) == 1) ? 1 : 0; // one of them is 0, means we are an edge + float innerarea = ((edgeU + edgeV + edgeW) == 0) ? 1 : 0; // none are 0, means we are interior + + if (innerarea != 1) { + // Note: the order of the vertices/edges we choose here can be different per application + // and depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + if (corner) { + if (U > 1.0 - edgeThreshold) + dominantVector = DV1; + else if (V > 1.0 - edgeThreshold) + dominantVector = DV2; + else if (W > 1.0 - edgeThreshold) + dominantVector = DV0; + } else { + if (edgeU) + dominantVector = lerp(DE2A, DE2B, W); + else if (edgeV) + dominantVector = lerp(DE0A, DE0B, U); + else + dominantVector = lerp(DE1A, DE1B, V); + } + } + + return dominantVector; +} + +// outside of view? +float IsClipped(float4 clipPos) { + float W = clipPos.w + DisplacementClippingBias; // bias allows artist to control to early clipping due to displacement + // Test whether the position is entirely inside the view frustum. + return (-W <= clipPos.x && clipPos.x <= W && -W <= clipPos.y && clipPos.y <= W && -W <= clipPos.z && clipPos.z <= W) ? 0.0f : 1.0f; +} + +// Compute whether all three control points along the edge are outside of the view frustum. +// By doing this, we're ensuring that +// 1.0 means clipped, 0.0 means unclipped. +float ComputeClipping(float3 cpA, float3 cpB, float3 cpC) { + // Compute the projected position for each position, then check to see whether they are clipped. + float4 projPosA = mul(float4(cpA, 1), viewPrj), projPosB = mul(float4(cpB, 1), viewPrj), projPosC = mul(float4(cpC, 1), viewPrj); + return min(min(IsClipped(projPosA), IsClipped(projPosB)), IsClipped(projPosC)); +} + +// PN Triangles and PN-AEN control points: +float3 ComputeCP(float3 posA, float3 posB, float3 normA) { + return (2.0f * posA + posB - (dot((posB - posA), normA) * normA)) / 3.0f; +} +#endif + +// Clip pixel away when opacity mask is used +void OpacityMaskClip(float2 uv) { + if (UseOpacityMaskTexture) { + float OpacityMaskMap = OpacityMaskTexture.Sample(SamplerAnisoWrap, uv).x; + + // clip value when less then 0 for punch-through alpha. + clip(OpacityMaskMap < OpacityMaskBias ? -1 : 1); + } +} + + +// Calculate a light: +struct lightOut { + float Specular; + float3 Color; +}; + +lightOut CalculateLight(bool lightEnable, int lightType, float lightAtten, float3 lightPos, float3 vertWorldPos, + float3 lightColor, float lightIntensity, float3 lightDir, float lightConeAngle, float lightFallOff, float4x4 lightViewPrjMatrix, + uniform Texture2D lightShadowMap, bool lightShadowOn, float3 vertexNormal, float3 normal, float3 diffuseColorIn, + float3 eyeVec, float roughness, float3 specularColorIn, float3 thickness, float softenMask, + float gammaCorrection, float opacity, float3 ambientOcclusion, float3 skinOcclusion, float2 screenCoord, float2 size, float scatteringRadius) { + lightOut OUT = (lightOut)0; + + OUT.Specular = 0.0; + OUT.Color = float3(0, 0, 0); + + if (lightEnable) { + // For Maya, flip the lightDir: +#ifdef _MAYA_ + lightDir = -lightDir; +#endif + + bool isAmbientLight = (lightType == 5); + if (isAmbientLight) { + OUT.Color = diffuseColorIn * lightColor * lightIntensity; + OUT.Color.rgb *= ambientOcclusion; + return OUT; + } + + bool isDirectionalLight = (lightType == 4); + float3 lightVec = lerp(lightPos - vertWorldPos, lightDir, isDirectionalLight); + + float3 L = normalize(lightVec); + + // Diffuse: + float3 diffuseDirect = float3(0, 0, 0); + float3 scatter = float3(skinCoeffX, skinCoeffY, skinCoeffZ); + diffuseDirect = PennerSkin(scatter, normal, L, vertexNormal, 1 - (scatteringRadius*skinScattering)) * diffuseColorIn; + //diffuseDirect = PennerSkinNoLUT(scatter,normal,L, vertexNormal) * diffuseColorIn; + + // Specular: + float3 specularDirect = float3(0, 0, 0); + + float3 Lobe1 = KelemenSzirmaykalos(normal, L, eyeVec, roughness, specularColorIn); + float3 Lobe2 = KelemenSzirmaykalos(normal, L, eyeVec, roughness*0.5, specularColorIn); + + specularDirect = Lobe2 * LobeMix + Lobe1 * (1 - LobeMix); + + // Light Attenuation: + bool enableAttenuation = lightAtten > 0.0001f; + float attenuation = 1.0f; + if (!isDirectionalLight) { + attenuation = lerp(1.0, 1 / pow(length(lightVec), lightAtten), enableAttenuation); + } + + // Spot light Cone Angle: + float angle = 1; + if (lightType == 2) { + angle = lightConeangle(lightConeAngle, lightFallOff, lightVec, lightDir); + } + + // Shadows: + float shadow = 1; + float3 skinShadow = float3(1, 1, 1); + float3 softShadow = float3(1, 1, 1); + if (UseShadows && lightShadowOn) { + shadow = lightShadow(lightViewPrjMatrix, lightShadowMap, vertWorldPos, screenCoord, shadowBlur, size); + + skinShadow = LutTexture.Sample(SamplerAnisoClamp, float2(shadow * angle, 1 - shadowScattering)); + skinShadow = lerp(dot(float3(0.33, 0.59, 0.11), skinShadow), skinShadow, shadowSaturation); + skinShadow = lerp(skinShadow, 1, (shadow* angle)*(shadow* angle)*(shadow* angle)); + } + + float3 lightAttenuation = lightIntensity * angle * attenuation * lightColor; + + diffuseDirect *= lightIntensity * skinShadow * attenuation * lightColor; + specularDirect *= lightAttenuation * shadow; + + float3 backScattering = float3(0, 0, 0); + if (UseTranslucency) { + half backRoughness = (1 - skinScatteringRoughness) * 128; + float3 viewScattering = exp2(saturate(dot(eyeVec, -(L + (normal * 0.01)))) * backRoughness - backRoughness) * skinScatteringAmount; + float3 lightScattering = saturate(dot(-L, normal)*0.5 + 0.5) * skinAmbientScatteringAmount; + + //float3 IBLScattering = diffuseIBL; + backScattering = (viewScattering + lightScattering) * lightAttenuation * shadow * thickness; + + float3 profile = skinScatteringOuterColor * backScattering; + backScattering = profile * skinScatteringAmount; + + + /*float scale = 2e4 * (1.0 - skinScatteringAmount) / backRoughness; + + float4 shrinkedPos = float4(vertWorldPos - 0.005 * vertexNormal, 1.0); + + float4 shadowPosition = mul(shrinkedPos, lightViewPrjMatrix); + + float d1 = lightShadowMap.Sample(SamplerShadowDepth, shadowPosition.xy / shadowPosition.w); // 'd1' has a range of 0..1 + + float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane' + d1 *= skinScatteringPlane*shadowPosition.w; // So we scale 'd1' accordingly: + float d = scale * abs(d1 - d2); + + float dd = -d * d; + float3 profile = float3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + float3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + float3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + float3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + float3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + float3(0.078, 0.0, 0.0) * exp(dd / 7.41); + backScattering = profile * saturate((0.3 + dot(L, -vertexNormal)) / 1.3) * thickness * diffuseColorIn; */ + } + + OUT.Color += diffuseDirect * skinOcclusion; + OUT.Color *= opacity; + OUT.Color += specularDirect * ambientOcclusion + backScattering; + + // Output specular and rim for opacity: + // OUT.Specular = dot(saturate(specularColor), float3(0.3f, 0.6f, 0.1f)); + } // end if light enabled + + return OUT; +} + +//------------------------------------ +// vertex shader with tessellation +//------------------------------------ +// take inputs from 3d-app +// vertex animation/skinning would happen here +SHADERDATA vt(APPDATA IN) { + SHADERDATA OUT = (SHADERDATA)0; + + // we pass vertices in world space + float4 worldPos = mul(float4(IN.position, 1), world); + OUT.worldPosition.xyz = worldPos.xyz; + +#ifdef _SUPPORTTESSELLATION_ + OUT.position = worldPos; +#else + OUT.position = float4(IN.position.xyz, 1); +#endif + + OUT.screenCoord = mul(float4(OUT.position.xyz, 1), viewPrj); + + // Pass through texture coordinates + // flip Y for Maya +#ifdef _MAYA_ + OUT.texCoord0 = float2(IN.texCoord0.x, (1.0 - IN.texCoord0.y)); + OUT.texCoord1 = float2(IN.texCoord1.x, (1.0 - IN.texCoord1.y)); + OUT.texCoord2 = float2(IN.texCoord2.x, (1.0 - IN.texCoord2.y)); +#else + OUT.texCoord0 = IN.texCoord0; + OUT.texCoord1 = IN.texCoord1; + OUT.texCoord2 = IN.texCoord2; +#endif + + // output normals in world space: + if (!SupportNonUniformScale) { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)world)); + } else { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)worldIT)); + } + + // output tangent in world space: + if (!SupportNonUniformScale) { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)world)); + } else { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)worldIT)); + } + + // store direction for normal map: + OUT.worldTangent.w = 1; + if (dot(cross(IN.normal.xyz, IN.tangent.xyz), IN.binormal.xyz) < 0.0) { + OUT.worldTangent.w = -1; + } + + return OUT; +} + + +//------------------------------------ +// vertex shader without tessellation +//------------------------------------ +SHADERDATA v(APPDATA IN) { + SHADERDATA OUT = vt(IN); + + // If we don't use tessellation, pass vertices in clip space: +#ifdef _SUPPORTTESSELLATION_ + OUT.position = mul(float4(OUT.position.xyz, 1), viewPrj); +#else + OUT.position = mul(float4(IN.position, 1), wvp); +#endif + + return OUT; +} + +#ifdef _SUPPORTTESSELLATION_ +//------------------------------------ +// hull shader +//------------------------------------ +// executed once per control point. +// control points can be considered the original vertices of the mesh +// outputs a control point +// run parallel with hull constant function +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_cw")] +[patchconstantfunc("HS_Constant")] +[outputcontrolpoints(3)] +[maxtessfactor(64.0)] + +// PN-AEN without displacement fix: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + +// PN Triangles, no crack fixes: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + + +// PN-AEN and displacement fix +// the index buffer is made up as follows: +// the triangle vertices index (int3) // PNAEN9 and PNAEN18 +// the 3 adjacent edges vertices index (3 * int2) // PNAEN9 and PNAEN18 +// the 3 dominant edges vertices index (3 * int2) // PNAEN18 +// the dominant position vertices index (int3) // PNAEN18 +SHADERDATA HS(InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID) { + SHADERDATA OUT = (SHADERDATA)0; + + // copy everything first: + OUT = IN[index]; + + // Compute the next output control point ID so we know which edge we're on. + const uint nextIndex = index < 2 ? index + 1 : 0; // (index + 1) % 3 + + // PN-AEN 9 and 18: + const uint neighborIndex = 3 + 2 * index; + const uint neighborNextIndex = neighborIndex + 1; + float3 myCP, neighborCP; + + // Calculate original PN control points and neighbors'. Then average. + myCP = ComputeCP(IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + neighborCP = ComputeCP(IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldNormal); + OUT.CP1 = (myCP + neighborCP) / 2; + + myCP = ComputeCP(IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + neighborCP = ComputeCP(IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldNormal); + OUT.CP2 = (myCP + neighborCP) / 2; + + // PN Triangles only would be: + // OUT.CP1 = ComputeCP( IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + // OUT.CP2 = ComputeCP( IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + + // Clipping: + OUT.clipped = ComputeClipping(OUT.worldPosition, OUT.CP1, OUT.CP2); + + // PN-AEN discontinuity code for displacement UVs: + const uint dominantEdgeIndex = 9 + 2 * index; + const uint dominantEdgeNextIndex = dominantEdgeIndex + 1; + const uint dominantVertexIndex = 15 + index; + + // Note: the order of the vertices/edges we choose here can be different per application and + // depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + float2 dominantEdgeUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeIndex].texCoord0, IN[dominantEdgeIndex].texCoord1, IN[dominantEdgeIndex].texCoord2); + float2 dominantEdgeNextUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeNextIndex].texCoord0, IN[dominantEdgeNextIndex].texCoord1, IN[dominantEdgeNextIndex].texCoord2); + float2 dominantVertexUV = pickTexcoord(DisplacementTexcoord, IN[dominantVertexIndex].texCoord0, IN[dominantVertexIndex].texCoord1, IN[dominantVertexIndex].texCoord2); + + OUT.dominantEdge = float4(dominantEdgeNextUV, dominantEdgeUV); + OUT.dominantVertex = dominantVertexUV; + + // VDM dominant normal and tangent for displacement crack fix: + OUT.dominantNormalE0 = IN[dominantEdgeNextIndex].worldNormal.xyz; + OUT.dominantNormalE1 = IN[dominantEdgeIndex].worldNormal.xyz; + OUT.dominantNormalCorner = IN[dominantVertexIndex].worldNormal.xyz; + + OUT.dominantTangentE0 = IN[dominantEdgeNextIndex].worldTangent.xyz; + OUT.dominantTangentE1 = IN[dominantEdgeIndex].worldTangent.xyz; + OUT.dominantTangentCorner = IN[dominantVertexIndex].worldTangent.xyz; + + return OUT; +} + +//------------------------------------ +// Hull shader constant function +//------------------------------------ +// executed once per patch +// outputs user defined data per patch and tessellation factor +// calculates control points for vertex and normal and passes to domain +// This hull shader passes the tessellation factors through to the HW tessellator, +// run parallel with hull function +HSCONSTANTDATA HS_Constant(const OutputPatch IN, uint patchID : SV_PrimitiveID) { + HSCONSTANTDATA OUT = (HSCONSTANTDATA)0; + + // future todo: + // triangle is on silhouette? + // triangle is facing camera? If facing backwards, reduce tessellation + // triangle lies in high frequency area of displacement map (density-based tessellation)? + + // Now setup the PNTriangle control points... + // Center control point + float3 f3E = (IN[0].CP1 + IN[0].CP2 + IN[1].CP1 + IN[1].CP2 + IN[2].CP1 + IN[2].CP2) / 6.0f; + float3 f3V = (IN[0].worldPosition + IN[1].worldPosition + IN[2].worldPosition) / 3.0f; + OUT.CPCenter = f3E + ((f3E - f3V) / 2.0f); + + // Clipping: + float4 centerViewPos = mul(float4(OUT.CPCenter, 1), viewPrj); + bool centerClipped = IsClipped(centerViewPos); + + if (IN[0].clipped && IN[1].clipped && IN[2].clipped && centerClipped) { + // If all control points are clipped, the surface cannot possibly be visible. + // Not entirely true, because displacement mapping can make them visible in the domain shader + // so we provide the user with a bias factor to avoid clipping too early + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = 0; + } else { + // Camera based tessellation, per object. So very basic. + float3 CameraPosition = viewInv[3].xyz; + float LengthOp = length((CameraPosition - world[3].xyz)); + float DivOp = (TessellationRange / LengthOp); + float MaxOp = max(TessellationMin + DivOp, 1); + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = MaxOp; + } + + // Inside tess factor is just the average of the edge factors + OUT.InsideTessFactor = (OUT.TessFactor[0] + OUT.TessFactor[1] + OUT.TessFactor[2]) / 3.0f; + + return OUT; +} + +//------------------------------------ +// domain shader +//------------------------------------ +// outputs the new vertices based on previous tessellation. +// also calculates new normals and uvs +// This domain shader applies contol point weighting to the barycentric coords produced by the FF tessellator +// If you wanted to do any vertex lighting, it would have to happen here. +[domain("tri")] +SHADERDATA DS(HSCONSTANTDATA HSIN, OutputPatch IN, float3 f3BarycentricCoords : SV_DomainLocation) { + SHADERDATA OUT = (SHADERDATA)0; + + // The barycentric coordinates + float fU = f3BarycentricCoords.x; + float fV = f3BarycentricCoords.y; + float fW = f3BarycentricCoords.z; + + // Precompute squares and squares * 3 + float fUU = fU * fU; + float fVV = fV * fV; + float fWW = fW * fW; + float fUU3 = fUU * 3.0f; + float fVV3 = fVV * 3.0f; + float fWW3 = fWW * 3.0f; + + // PN position: + float3 position = IN[0].worldPosition * fWW * fW + + IN[1].worldPosition * fUU * fU + + IN[2].worldPosition * fVV * fV + + IN[0].CP1 * fWW3 * fU + + IN[0].CP2 * fW * fUU3 + + IN[2].CP2 * fWW3 * fV + + IN[1].CP1 * fUU3 * fV + + IN[2].CP1 * fW * fVV3 + + IN[1].CP2 * fU * fVV3 + + HSIN.CPCenter * 6.0f * fW * fU * fV; + + // Flat position: + float3 flatPosition = IN[0].worldPosition * fW + IN[1].worldPosition * fU + IN[2].worldPosition * fV; + + // allow user to blend between PN tessellation and flat tessellation: + position = lerp(position, flatPosition, FlatTessellation); + + // Interpolate normal + float3 normal = IN[0].worldNormal * fW + IN[1].worldNormal * fU + IN[2].worldNormal * fV; + + // Normalize the interpolated normal + OUT.worldNormal = normalize(normal); + + // Compute tangent: + float3 tangent = IN[0].worldTangent.xyz * fW + IN[1].worldTangent.xyz * fU + IN[2].worldTangent.xyz * fV; + OUT.worldTangent.xyz = normalize(tangent.xyz); + + // Pass through the direction of the binormal as calculated in the vertex shader + OUT.worldTangent.w = IN[0].worldTangent.w; + + // Linear interpolate the texture coords + OUT.texCoord0 = IN[0].texCoord0 * fW + IN[1].texCoord0 * fU + IN[2].texCoord0 * fV; + OUT.texCoord1 = IN[0].texCoord1 * fW + IN[1].texCoord1 * fU + IN[2].texCoord1 * fV; + OUT.texCoord2 = IN[0].texCoord2 * fW + IN[1].texCoord2 * fU + IN[2].texCoord2 * fV; + + // apply displacement map (only when not rendering the Maya preview swatch): + if (UseDisplacementMap && !IsSwatchRender) { + // Fix Displacement Seams. + // we assume here that the displacement UVs is UVset 0. + // if this UVset index is changed, it should als be changed in the hull shader + // PN-AEN 18 with displacement UV seam fix + float2 displaceUV = pickTexcoord(DisplacementTexcoord, OUT.texCoord0, OUT.texCoord1, OUT.texCoord2); + float3 displacementUVW = PickDominant(float3(displaceUV, 0), fU, fV, fW, + float3(IN[0].dominantEdge.xy, 0), float3(IN[0].dominantEdge.zw, 0), + float3(IN[1].dominantEdge.xy, 0), float3(IN[1].dominantEdge.zw, 0), + float3(IN[2].dominantEdge.xy, 0), float3(IN[2].dominantEdge.zw, 0), + float3(IN[0].dominantVertex.xy, 0), + float3(IN[1].dominantVertex.xy, 0), + float3(IN[2].dominantVertex.xy, 0)); + + // We can still get cracks here because the world tangent and normal may be different for vertices on each side of the UV seam, + // because we do the tangent to world conversion, we get the same diplacement amount, but it results in different movement once converted to world space. + // And even a tiny difference between normal or tangent will cause large cracks. + float3 displacementNormal = PickDominant(OUT.worldNormal, + fU, fV, fW, + IN[0].dominantNormalE0, IN[0].dominantNormalE1, + IN[1].dominantNormalE0, IN[1].dominantNormalE1, + IN[2].dominantNormalE0, IN[2].dominantNormalE1, + IN[0].dominantNormalCorner, + IN[1].dominantNormalCorner, + IN[2].dominantNormalCorner); + + displacementNormal = normalize(displacementNormal); + + if (DisplacementModel == 1) { // Tangent Vector Displacement + float3 displacementTangent = PickDominant(OUT.worldTangent.xyz, fU, fV, fW, + IN[0].dominantTangentE0, IN[0].dominantTangentE1, + IN[1].dominantTangentE0, IN[1].dominantTangentE1, + IN[2].dominantTangentE0, IN[2].dominantTangentE1, + IN[0].dominantTangentCorner, + IN[1].dominantTangentCorner, + IN[2].dominantTangentCorner); + + displacementTangent = normalize(displacementTangent); + + float3 vecDisp = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).xyz; + vecDisp -= DisplacementOffset; + + float3 Bn = cross(displacementNormal, displacementTangent); + float3x3 toWorld = float3x3(displacementTangent, Bn.xyz, displacementNormal); + + float3 VDMcoordSys = vecDisp.xzy; // Mudbox + if (VectorDisplacementCoordSys == 1) { + VDMcoordSys = vecDisp.xyz; // Maya or ZBrush + } + + float3 vecDispW = mul(VDMcoordSys, toWorld) * DisplacementHeight; + position.xyz += vecDispW; + } else { + // offset (-0.5) so that we can have negative displacement also + float offset = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).x - DisplacementOffset; + position.xyz += displacementNormal * offset * DisplacementHeight; + } + } + + // Update World Position value for inside pixel shader: + OUT.worldPosition = position.xyz; + + // Transform model position with view-projection matrix + //OUT.position = float4(position.xyz, 1); // with geo + OUT.position = mul(float4(position.xyz, 1), viewPrj); // without geo + + return OUT; +} + +//------------------------------------ +// Geometry Shader +//------------------------------------ +// This is a sample Geo shader. Disabled in this shader, but left here for your reference. +// If you wish to enable it, search for 'with geo' in this shader for code to change. +[maxvertexcount(3)] // Declaration for the maximum number of vertices to create +void GS(triangle SHADERDATA IN[3], inout TriangleStream TriStream) { + SHADERDATA OUT; + + // quick test to see if geo also works: + for (int i = 0; i<3; ++i) { + OUT = IN[i]; + OUT.position = mul(mul(float4(OUT.position.xyz, 1), view), prj); + TriStream.Append(OUT); + } + TriStream.RestartStrip(); // end triangle +} +#endif + +void sampleMasks() { + +} + +//------------------------------------ +// pixel shader +//------------------------------------ +float4 f(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) : SV_Target { +#ifdef _3DSMAX_ + FrontFace = !FrontFace; +#endif + // clip are early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float gammaCorrection = lerp(1.0, 2.2, LinearSpaceLighting); + + float3 N = normalize(IN.worldNormal.xyz); + if (flipBackfaceNormals) { + N = lerp(-N, N, FrontFace); + } + float3 Nw = N; + + // Tangent and BiNormal: + float3 T = normalize(IN.worldTangent.xyz); + float3 Bn = cross(N, T); + Bn *= IN.worldTangent.w; + + float4 diffuse = float4(1, 1, 1, 1); + if (UseDiffuseTexture) { + float2 diffuseUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 diffuseTextureSample = DiffuseTexture.Sample(SamplerAnisoWrap, diffuseUV); + + if (UseDiffuseTextureAlpha) { + diffuse.a = diffuseTextureSample.a; + } + + diffuse.rgb *= pow(diffuseTextureSample.rgb, gammaCorrection); + } + + float3 microNormal = float3(0, 0, 1); + if (UseNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(NormalTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 NormalMap = NormalTexture.Sample(SamplerAnisoWrap, normalUV).xyz * 2.0 - 1.0; + float3 backupNormal = NormalMap; + + if (NormalCoordsysX > 0) + NormalMap.x = -NormalMap.x; + if (NormalCoordsysY > 0) + NormalMap.y = -NormalMap.y; + + NormalMap.xy *= NormalHeight; + + if (UseMicroNormalTexture) { + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + NormalMap.xy += microNormal.xy; + } + + if (UseBlendTexture) { + float2 blendUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + + float3 animNormalSample_00 = animNormalMap_00.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_00.y = -animNormalSample_00.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_00.x = -animNormalSample_00.x; + } + float3 animNormalDelta_00 = animNormalSample_00 - NormalMap; + float3 animNormalSample_01 = animNormalMap_01.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_01.y = -animNormalSample_01.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_01.x = -animNormalSample_01.x; + } + float3 animNormalDelta_01 = animNormalSample_01 - NormalMap; + float3 animNormalSample_02 = animNormalMap_02.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_02.y = -animNormalSample_02.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_02.x = -animNormalSample_02.x; + } + float3 animNormalDelta_02 = animNormalSample_02 - NormalMap; + + float3 animColorDelta_00 = (pow(animColorMap_00.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + float3 animColorDelta_01 = (pow(animColorMap_01.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + float3 animColorDelta_02 = (pow(animColorMap_02.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + + float maskChannelVal_00 = maskChannel_00.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_01 = maskChannel_01.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_02 = maskChannel_02.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_03 = maskChannel_03.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_04 = maskChannel_04.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_05 = maskChannel_05.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_06 = maskChannel_06.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_07 = maskChannel_07.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_08 = maskChannel_08.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_09 = maskChannel_09.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_10 = maskChannel_10.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_11 = maskChannel_11.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_12 = maskChannel_12.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_13 = maskChannel_13.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_14 = maskChannel_14.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_15 = maskChannel_15.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_16 = maskChannel_16.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_17 = maskChannel_17.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_18 = maskChannel_18.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_19 = maskChannel_19.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_20 = maskChannel_20.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_21 = maskChannel_21.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_22 = maskChannel_22.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_23 = maskChannel_23.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_24 = maskChannel_24.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_25 = maskChannel_25.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_26 = maskChannel_26.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_27 = maskChannel_27.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_28 = maskChannel_28.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_29 = maskChannel_29.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_30 = maskChannel_30.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_31 = maskChannel_31.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_32 = maskChannel_32.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_33 = maskChannel_33.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_34 = maskChannel_34.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_35 = maskChannel_35.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_36 = maskChannel_36.Sample(SamplerAnisoWrap, blendUV); + + NormalMap.xy += animNormalDelta_00 * maskWeight_47 * maskChannelVal_36 + + animNormalDelta_00 * maskWeight_15 * maskChannelVal_05 + + animNormalDelta_00 * maskWeight_13 * maskChannelVal_04 + + animNormalDelta_00 * maskWeight_46 * maskChannelVal_35 + + animNormalDelta_00 * maskWeight_73 * maskChannelVal_06 + + animNormalDelta_00 * maskWeight_11 * maskChannelVal_03 + + animNormalDelta_00 * maskWeight_65 * maskChannelVal_11 + + animNormalDelta_00 * maskWeight_75 * maskChannelVal_07 + + animNormalDelta_00 * maskWeight_67 * maskChannelVal_12 + + animNormalDelta_00 * maskWeight_09 * maskChannelVal_02 + + animNormalDelta_00 * maskWeight_49 * maskChannelVal_34 + + animNormalDelta_00 * maskWeight_71 * maskChannelVal_10 + + animNormalDelta_00 * maskWeight_48 * maskChannelVal_33 + + animNormalDelta_00 * maskWeight_23 * maskChannelVal_14 + + animNormalDelta_00 * maskWeight_69 * maskChannelVal_09 + + animNormalDelta_00 * maskWeight_18 * maskChannelVal_00 + + animNormalDelta_00 * maskWeight_22 * maskChannelVal_01 + + animNormalDelta_00 * maskWeight_77 * maskChannelVal_08 + + animNormalDelta_00 * maskWeight_19 * maskChannelVal_13 + + animNormalDelta_01 * maskWeight_07 * maskChannelVal_18 + + animNormalDelta_01 * maskWeight_03 * maskChannelVal_16 + + animNormalDelta_01 * maskWeight_81 * maskChannelVal_22 + + animNormalDelta_01 * maskWeight_79 * maskChannelVal_21 + + animNormalDelta_01 * maskWeight_01 * maskChannelVal_15 + + animNormalDelta_01 * maskWeight_05 * maskChannelVal_17 + + animNormalDelta_01 * maskWeight_63 * maskChannelVal_20 + + animNormalDelta_01 * maskWeight_37 * maskChannelVal_23 + + animNormalDelta_01 * maskWeight_61 * maskChannelVal_19 + + animNormalDelta_01 * maskWeight_39 * maskChannelVal_24 + + animNormalDelta_02 * maskWeight_59 * maskChannelVal_34 + + animNormalDelta_02 * maskWeight_35 * maskChannelVal_30 + + animNormalDelta_02 * maskWeight_54 * maskChannelVal_35 + + animNormalDelta_02 * maskWeight_58 * maskChannelVal_36 + + animNormalDelta_02 * maskWeight_29 * maskChannelVal_29 + + animNormalDelta_02 * maskWeight_55 * maskChannelVal_33 + + animNormalDelta_02 * maskWeight_28 * maskChannelVal_27 + + animNormalDelta_02 * maskWeight_33 * maskChannelVal_26 + + animNormalDelta_02 * maskWeight_27 * maskChannelVal_25 + + animNormalDelta_02 * maskWeight_34 * maskChannelVal_28 + + animNormalDelta_02 * maskWeight_41 * maskChannelVal_31 + + animNormalDelta_02 * maskWeight_51 * maskChannelVal_32; + + diffuse.rgb += animColorDelta_00 * maskWeight_20 * maskChannelVal_01 + + animColorDelta_00 * maskWeight_70 * maskChannelVal_10 + + animColorDelta_00 * maskWeight_43 * maskChannelVal_36 + + animColorDelta_00 * maskWeight_66 * maskChannelVal_12 + + animColorDelta_00 * maskWeight_45 * maskChannelVal_34 + + animColorDelta_00 * maskWeight_12 * maskChannelVal_04 + + animColorDelta_00 * maskWeight_14 * maskChannelVal_05 + + animColorDelta_00 * maskWeight_44 * maskChannelVal_33 + + animColorDelta_00 * maskWeight_42 * maskChannelVal_35 + + animColorDelta_00 * maskWeight_16 * maskChannelVal_00 + + animColorDelta_00 * maskWeight_74 * maskChannelVal_07 + + animColorDelta_00 * maskWeight_64 * maskChannelVal_11 + + animColorDelta_00 * maskWeight_68 * maskChannelVal_09 + + animColorDelta_00 * maskWeight_10 * maskChannelVal_03 + + animColorDelta_00 * maskWeight_08 * maskChannelVal_02 + + animColorDelta_00 * maskWeight_72 * maskChannelVal_06 + + animColorDelta_00 * maskWeight_21 * maskChannelVal_14 + + animColorDelta_00 * maskWeight_76 * maskChannelVal_08 + + animColorDelta_00 * maskWeight_17 * maskChannelVal_13 + + animColorDelta_01 * maskWeight_78 * maskChannelVal_21 + + animColorDelta_01 * maskWeight_60 * maskChannelVal_19 + + animColorDelta_01 * maskWeight_80 * maskChannelVal_22 + + animColorDelta_01 * maskWeight_06 * maskChannelVal_18 + + animColorDelta_01 * maskWeight_04 * maskChannelVal_17 + + animColorDelta_01 * maskWeight_62 * maskChannelVal_20 + + animColorDelta_01 * maskWeight_38 * maskChannelVal_24 + + animColorDelta_01 * maskWeight_36 * maskChannelVal_23 + + animColorDelta_01 * maskWeight_02 * maskChannelVal_16 + + animColorDelta_01 * maskWeight_00 * maskChannelVal_15 + + animColorDelta_02 * maskWeight_30 * maskChannelVal_26 + + animColorDelta_02 * maskWeight_52 * maskChannelVal_35 + + animColorDelta_02 * maskWeight_32 * maskChannelVal_30 + + animColorDelta_02 * maskWeight_26 * maskChannelVal_29 + + animColorDelta_02 * maskWeight_24 * maskChannelVal_25 + + animColorDelta_02 * maskWeight_56 * maskChannelVal_36 + + animColorDelta_02 * maskWeight_25 * maskChannelVal_27 + + animColorDelta_02 * maskWeight_57 * maskChannelVal_34 + + animColorDelta_02 * maskWeight_53 * maskChannelVal_33 + + animColorDelta_02 * maskWeight_31 * maskChannelVal_28 + + animColorDelta_02 * maskWeight_50 * maskChannelVal_32 + + animColorDelta_02 * maskWeight_40 * maskChannelVal_31; + + } + NormalMap = mul(NormalMap.xyz, toWorld); + N = normalize(NormalMap); + } else { + if (UseMicroNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + microNormal = mul(microNormal.xyz, toWorld); + } + } + + diffuse.rgb *= DiffuseColor; + + float3 blurredNormal = lerp(N, Nw, NormalBlurring); + + float3 V = normalize(viewInv[3].xyz - IN.worldPosition.xyz); + + float4 specular = float4(0.028, 0.028, 0.028, 1); + specular.rgb *= SpecularColor; + + if (UseSpecularTexture) { + float2 opacityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 SpecularTextureSample = SpecularTexture.Sample(SamplerAnisoWrap, opacityUV); + + specular.rgb *= pow(SpecularTextureSample.rgb, gammaCorrection); + + if (UseSpecularTextureAlpha) { + specular.a = SpecularTextureSample.a; + } + } + + float cavity = 1; + if (UseCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float CavityTextureSample = CavityTexture.Sample(SamplerAnisoWrap, cavityUV); + + cavity = lerp(1, pow(CavityTextureSample, gammaCorrection), CavityAmount); + } + + float microCavity = 1; + if (UseMicroCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float MicroCavityTextureSample = MicroCavityTexture.Sample(SamplerAnisoWrap, cavityUV * MicroScale); + + microCavity = lerp(1, pow(MicroCavityTextureSample, gammaCorrection), MicroCavityAmount); + } + + specular.rgb *= cavity * microCavity; // We apply cavity on the specular before it is sent to the fresnel + + float roughness = Roughness; + if (UseSpecularTextureAlpha) { + roughness *= specular.a; + } + + float scatteringRadius = 1; + if (UseScatteringRadiusTexture) { + float2 scatteringUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 scatteringRadiusTextureSample = ScatteringRadiusTexture.Sample(SamplerAnisoWrap, scatteringUV); + + scatteringRadius *= pow(scatteringRadiusTextureSample, gammaCorrection); + } + + // Opacity: + float opacity = saturate(diffuse.a * Opacity); + + // Occlusion: + float3 ambientOcclusion = float3(1, 1, 1); + if (UseAmbientOcclusionTexture) { + float2 aomapUV = pickTexcoord(OcclusionTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 aomapTextureSample = OcclusionTexture.Sample(SamplerAnisoWrap, aomapUV).rgb; + ambientOcclusion *= lerp(1, pow(aomapTextureSample.rgb, gammaCorrection), OcclusionAmount); + } + + float3 thickness = float3(1, 1, 1); + if (UseThicknessTexture) { + float2 thicknessUV = pickTexcoord(ThicknessTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + thickness = pow(BackScatteringThicknessTexture.Sample(SamplerAnisoWrap, thicknessUV), gammaCorrection).xyz; + } + + float3 skinOcclusion = coloredOcclusion(diffuse, ambientOcclusion); // Colored occlusion for skin + + float softenMask = 1.0f; + + float2 screenCoord = IN.screenCoord.xy / IN.screenCoord.w; + //float2 currentScreenSize = screenSize; // TO DO FIND A WAY TO GET SCREEN SIZE, MAYA BUG ? + float2 currentScreenSize = float2(1024, 512); + + // -------- + // LIGHTS: + // -------- + // future todo: Maya could pass light info in array so we can loop any number of lights. + + // light 0: + lightOut light0 = CalculateLight(light0Enable, light0Type, light0AttenScale, light0Pos, IN.worldPosition.xyz, + light0Color, light0Intensity, light0Dir, light0ConeAngle, light0FallOff, light0Matrix, + light0ShadowMap, light0ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 1: + lightOut light1 = CalculateLight(light1Enable, light1Type, light1AttenScale, light1Pos, IN.worldPosition.xyz, + light1Color, light1Intensity, light1Dir, light1ConeAngle, light1FallOff, light1Matrix, + light1ShadowMap, light1ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 2: + lightOut light2 = CalculateLight(light2Enable, light2Type, light2AttenScale, light2Pos, IN.worldPosition.xyz, + light2Color, light2Intensity, light2Dir, light2ConeAngle, light2FallOff, light2Matrix, + light2ShadowMap, light2ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + float3 lightTotal = light0.Color + light1.Color + light2.Color; + + + // ---------------------- + // IMAGE BASED LIGHTING + // ---------------------- + + // Specular IBL + float3 specularIBL = float3(0, 0, 0); + bool reflectMapUsed = UseSpecCubeIBL; + if (reflectMapUsed) { + int lod = 7; // Hard coded mip map level + + float3 reflectionVector = reflect(-V, N); + + reflectionVector = RotateVectorYaw(reflectionVector, SkyRotation); + reflectionVector = normalize(reflectionVector); + float NdotV = saturate(dot(N, V)); + float3 F = F_LagardeSchlick(specular, 1 - roughness, NdotV); + + specularIBL += SpecularCubeIBL.SampleLevel(CubeMapSampler, reflectionVector, lod * roughness).rgb * F; + } + + // Diffuse IBL + float3 diffuseIBL = float3(0, 0, 0); + bool useDiffuseIBL = UseDiffuseIBLMap; + if (useDiffuseIBL) { + // We use the world normal to sample the lighting texture + float3 diffuseIBLVec_High = N; + float3 diffuseIBLVec_Low = blurredNormal; + + diffuseIBLVec_High = RotateVectorYaw(diffuseIBLVec_High, SkyRotation); + diffuseIBLVec_High = normalize(diffuseIBLVec_High); + + diffuseIBLVec_Low = RotateVectorYaw(diffuseIBLVec_Low, SkyRotation); + diffuseIBLVec_Low = normalize(diffuseIBLVec_Low); + + float3 diffuseIBL_High = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_High, 0).rgb; + float3 diffuseIBL_Low = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_Low, 0).rgb; + + diffuseIBL = diffuseSkinIBL(float3(skinCoeffX, skinCoeffY, skinCoeffZ), diffuseIBL_High, diffuseIBL_Low); + } + + // ---------------------- + // FINAL COLOR AND ALPHA: + // ---------------------- + + float3 result = float3(0, 0, 0); + + result += diffuse * diffuseIBL * DiffuseIBLIntensity * skinOcclusion; + + result += specularIBL * SpecularIBLIntensity * specularOcclusion(N, V, ambientOcclusion); + + result += lightTotal; + + //result = N; + + // do gamma correction in shader: + if (!MayaFullScreenGamma) + result = pow(result, 1 / gammaCorrection); + + // final alpha: + float transparency = opacity; + transparency = saturate(transparency); // keep 0-1 range + + return float4(result, transparency); +} + + +#ifdef _MAYA_ +void Peel(SHADERDATA IN) { + float currZ = abs(mul(float4(IN.worldPosition, 1.0f), view).z); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + float2 UV = Pndc.xy / Pndc.w * float2(0.5f, -0.5f) + 0.5f; + float prevZ = transpDepthTexture.Sample(SamplerShadowDepth, UV).r; + float opaqZ = opaqueDepthTexture.Sample(SamplerShadowDepth, UV).r; + float bias = 0.00002f; + + if (currZ < prevZ * (1.0f + bias) || currZ > opaqZ * (1.0f - bias)) { + discard; + } +} + +float4 LinearDepth(SHADERDATA IN) { + return abs(mul(float4(IN.worldPosition, 1.0f), view).z); +} + +float4 DepthComplexity(float opacity) { + return opacity > 0.001f ? 1.0f : 0.0f; +} + +struct MultiOut2 { + float4 target0 : SV_Target0; + float4 target1 : SV_Target1; +}; + +MultiOut2 fTransparentPeel(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = LinearDepth(IN); + return OUT; +} + +MultiOut2 fTransparentPeelAndAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +MultiOut2 fTransparentWeightedAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +//------------------------------------ +// wireframe pixel shader +//------------------------------------ +float4 fwire(SHADERDATA IN) : SV_Target { + return float4(0, 0, 1, 1); +} + + +//------------------------------------ +// pixel shader for shadow map generation +//------------------------------------ +//float4 ShadowMapPS( float3 Pw, float4x4 shadowViewProj ) +float4 ShadowMapPS(SHADERDATA IN) : SV_Target { + // clip as early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + + // divide Z and W component from clip space vertex position to get final depth per pixel + float retZ = Pndc.z / Pndc.w; + + retZ += fwidth(retZ); + return retZ.xxxx; +} +#endif + +//----------------------------------- +// Objects without tessellation +//------------------------------------ +technique11 TessellationOFF < + bool overridesDrawState = false; // we do not supply our own render state settings + int isTransparent = 3; + // objects with clipped pixels need to be flagged as isTransparent to avoid the occluding underlying geometry since Maya renders the object with flat shading when computing depth + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + // 'VariableNameAsAttributeName = false' can be used to tell Maya's DX11ShaderNode to use the UIName annotation string for the Maya attribute name instead of the shader variable name. + // When changing this option, the attribute names generated for the shader inside Maya will change and this can have the side effect that older scenes have their shader attributes reset to default. + // bool VariableNameAsAttributeName = false; + +#ifdef _MAYA_ + // Tells Maya that the effect supports advanced transparency algorithm, + // otherwise Maya would render the associated objects simply by alpha + // blending on top of other objects supporting advanced transparency + // when the viewport transparency algorithm is set to depth-peeling or + // weighted-average. + bool supportsAdvancedTransparency = true; +#endif +> +{ + pass p0 < string drawContext = "colorPass"; > { // tell maya during what draw context this shader should be active, in this case 'Color' + // even though overrideDrawState is false, we still set the pre-multiplied alpha state here in + // case Maya is using 'Depth Peeling' transparency algorithm + // This unfortunately won't solve sorting issues, but at least our object can draw transparent. + // If we don't set this, the object will always be opaque. + // In the future, hopefully ShaderOverride nodes can participate properly in Maya's Depth Peeling setup +#ifdef _MAYA_ + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); +#endif + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, f())); + } + +#ifdef _MAYA_ + pass pTransparentPeel < string drawContext = "transparentPeel"; > { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +#endif +} + +#ifdef _SUPPORTTESSELLATION_ +//----------------------------------- +// Objects with tessellation +//------------------------------------ +// Vertex Index Buffer options: +// index_buffer_type: None; // no divergent normals and no displacement crack fix +// index_buffer_type: PNAEN9; // divergent normals crack fix; no displacement UV seam crack fix +// index_buffer_type: PNAEN18, // crack fix for divergent normals and UV seam displacement +technique11 TessellationON < + string index_buffer_type = "PNAEN18"; // tell Maya what type of index buffer we want. Must be unique name per generator + bool overridesDrawState = false; + int isTransparent = 3; + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + bool supportsAdvancedTransparency = true; > { + pass p0 < string drawContext = "colorPass"; > { + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, f())); + } + + pass pTransparentPeel < string drawContext = "transparentPeel";> { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +} + +//----------------------------------- +// Wireframe +//------------------------------------ +technique11 WireFrame < + string index_buffer_type = "PNAEN18"; + bool overridesDrawState = false; // since we only change the fillMode, it can remain on false. If we changed the blend state, it would have to be true + int isTransparent = 0; > { + pass p0 < string drawContext = "colorPass"; > { + SetRasterizerState(WireframeCullFront); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, fwire())); + } +} +#endif diff --git a/data/shaders/dx11_shd_eyeLeft.fx b/data/shaders/dx11_shd_eyeLeft.fx new file mode 100644 index 00000000..6b745418 --- /dev/null +++ b/data/shaders/dx11_shd_eyeLeft.fx @@ -0,0 +1,2872 @@ +// Maya Skin shader made by Charles Greivelding 2014 + +//------------------------------------ +// Notes +//------------------------------------ +// Shader uses 'pre-multiplied alpha' as its render state and this Uber Shader is build to work in unison with that. +// Alternatively, in Maya, the dx11Shader node allows you to set your own render states by supplying the 'overridesDrawState' annotation in the technique +// You may find it harder to get proper transparency sorting if you choose to do so. + +// The technique annotation 'isTransparent' is used to tell Maya how treat the technique with respect to transparency. +// - If set to 0 the technique is always considered opaque +// - If set to 1 the technique is always considered transparent +// - If set to 2 the plugin will check if the parameter marked with the OPACITY semantic is less than 1.0 +// - If set to 3 the plugin will use the transparencyTest annotation to create a MEL procedure to perform the desired test. +// Maya will then render the object twice. Front faces follow by back faces. + +// For some objects you may need to switch the Transparency Algorithm to 'Depth Peeling' to avoid transparency issues. +// Models that require this usually have internal faces. + +//------------------------------------ +// Defines +//------------------------------------ +// how many mip map levels should Maya generate or load per texture. +// 0 means all possible levels +// some textures may override this value, but most textures will follow whatever we have defined here +// If you wish to optimize performance (at the cost of reduced quality), you can set NumberOfMipMaps below to 1 + +#define NumberOfMipMaps 0 +#define PI 3.1415926 +#define _3DSMAX_SPIN_MAX 99999 + +#ifndef _MAYA_ +#define _3DSMAX_ // at time of writing this shader, Nitrous driver did not have the _3DSMAX_ define set +#define _ZUP_ // Maya is Y up, 3dsMax is Z up +#endif + +#ifdef _MAYA_ +#define _SUPPORTTESSELLATION_ // at time of writing this shader, 3dsMax did not support tessellation +#endif + +//------------------------------------ +// State +//------------------------------------ +#ifdef _MAYA_ +RasterizerState WireframeCullFront { + CullMode = Front; + FillMode = WIREFRAME; +}; + +BlendState PMAlphaBlending { + AlphaToCoverageEnable = FALSE; + BlendEnable[0] = TRUE; + SrcBlend = ONE; + DestBlend = INV_SRC_ALPHA; + BlendOp = ADD; + SrcBlendAlpha = ONE; // Required for hardware frame render alpha channel + DestBlendAlpha = INV_SRC_ALPHA; + BlendOpAlpha = ADD; + RenderTargetWriteMask[0] = 0x0F; +}; +#endif + +//------------------------------------ +// Map Channels +//------------------------------------ +#ifdef _3DSMAX_ +int texcoord0 : Texcoord < + int Texcoord = 0; + int MapChannel = 1; + string UIWidget = "None"; +>; + +int texcoord1 : Texcoord < + int Texcoord = 1; + int MapChannel = 2; + string UIWidget = "None"; +>; + +int texcoord2 : Texcoord < + int Texcoord = 2; + int MapChannel = 3; + string UIWidget = "None"; +>; +#endif + +//------------------------------------ +// Samplers +//------------------------------------ +SamplerState CubeMapSampler { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; +}; + +SamplerState SamplerAnisoWrap { + Filter = ANISOTROPIC; + AddressU = Wrap; + AddressV = Wrap; +}; + +SamplerState SamplerAnisoClamp { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; +}; + +SamplerState SamplerShadowDepth { + Filter = MIN_MAG_MIP_POINT; + AddressU = Border; + AddressV = Border; + BorderColor = float4(1.0f, 1.0f, 1.0f, 1.0f); +}; + +//------------------------------------ +// Textures +//------------------------------------ + +Texture2D LutTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS LUT Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +Texture2D DitherTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Dither Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +// --------------------------------------------- +// Blend GROUP +// --------------------------------------------- + +bool UseBlendTexture < + string UIGroup = "Wrinkle mixing"; + string UIName = "Enable Wrinkle Mixing"; + int UIOrder = 919; +> = false; + + + + + + +Texture2D OcclusionTexture < + string UIGroup = "Occlusion"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Ambient Occlusion Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 401; + int UVEditorOrder = 2; +>; + +Texture2D ScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Radius Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 209; + int UVEditorOrder = 2; +>; + +Texture2D CavityTexture < + string UIGroup = "Cavity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 501; + int UVEditorOrder = 4; +>; + +Texture2D DiffuseTexture < + string UIGroup = "Diffuse"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 201; + int UVEditorOrder = 1; +>; + +Texture2D SpecularTexture < + string UIGroup = "Specular"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 302; + int UVEditorOrder = 4; +>; + +Texture2D NormalTexture < + string UIGroup = "Normal"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; // If mip maps exist in texture, Maya will load them. So user can pre-calculate and re-normalize mip maps for normal maps in .dds + int UIOrder = 601; + int UVEditorOrder = 5; +>; + +Texture2D MicroCavityTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 701; + int UVEditorOrder = 5; +>; + +Texture2D MicroNormalTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 704; + int UVEditorOrder = 5; +>; + +#ifdef _SUPPORTTESSELLATION_ +Texture2D DisplacementTexture < + string UIGroup = "Tessellation and Displacement"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Displacement Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 902; + int UVEditorOrder = 8; +>; +#endif + +Texture2D BackScatteringThicknessTexture < + string UIGroup = "BackScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Thickness Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 215; + int UVEditorOrder = 10; +>; + +Texture2D OpacityMaskTexture < + string UIGroup = "Opacity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Opacity Mask"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 800; + int UVEditorOrder = 12; +>; + +TextureCube DiffuseCubeIBL < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; // Use (or load) max number of mip map levels so we can use blurring + int UIOrder = 108; + int UVEditorOrder = 10; +>; + +TextureCube SpecularCubeIBL : environment < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; + int UIOrder = 111; + int UVEditorOrder = 6; +>; + +//------------------------------------ +// Shadow Maps +//------------------------------------ +Texture2D light0ShadowMap : SHADOWMAP < + string Object = "Light 0"; // UI Group for lights, auto-closed + string UIWidget = "None"; + int UIOrder = 5010; +>; + +Texture2D light1ShadowMap : SHADOWMAP < + string Object = "Light 1"; + string UIWidget = "None"; + int UIOrder = 5020; +>; + +Texture2D light2ShadowMap : SHADOWMAP < + string Object = "Light 2"; + string UIWidget = "None"; + int UIOrder = 5030; +>; + +//------------------------------------ +// Internal depth textures for Maya depth-peeling transparency +//------------------------------------ +#ifdef _MAYA_ + +Texture2D transpDepthTexture : transpdepthtexture < + string UIWidget = "None"; +>; + +Texture2D opaqueDepthTexture : opaquedepthtexture < + string UIWidget = "None"; +>; + +#endif + +//------------------------------------ +// Per Frame parameters +//------------------------------------ +cbuffer UpdatePerFrame : register(b0) { + float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; + float4x4 view : View < string UIWidget = "None"; >; + float4x4 prj : Projection < string UIWidget = "None"; >; + float4x4 viewPrj : ViewProjection < string UIWidget = "None"; >; + + // A shader may wish to do different actions when Maya is rendering the preview swatch (e.g. disable displacement) + // This value will be true if Maya is rendering the swatch + bool IsSwatchRender : MayaSwatchRender < string UIWidget = "None"; > = false; + float2 screenSize : ViewportPixelSize < string UIWidget = "None"; >; + + // If the user enables viewport gamma correction in Maya's global viewport rendering settings, the shader should not do gamma again + bool MayaFullScreenGamma : MayaGammaCorrection < string UIWidget = "None"; > = false; +} + + +//------------------------------------ +// Per Object parameters +//------------------------------------ +cbuffer UpdatePerObject : register(b1) { + float4x4 world : World < string UIWidget = "None"; >; + float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; +#ifndef _SUPPORTTESSELLATION_ + float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; +#endif + +// --------------------------------------------- +// Lighting Settings GROUP +// --------------------------------------------- +bool LinearSpaceLighting < + string UIGroup = "Lighting Settings"; + string UIName = "Linear Space Lighting"; + int UIOrder = 100; +> = true; + +bool UseShadows < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIName = "Shadows"; + int UIOrder = 101; +#endif +> = true; + +float shadowMultiplier < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UIMax = 1.000; + float UIStep = 0.001; + string UIName = "Shadow Strength"; + int UIOrder = 102; +#endif +> = { 1.0f }; + +// This offset allows you to fix any in-correct self shadowing caused by limited precision. +// This tends to get affected by scene scale and polygon count of the objects involved. +float shadowDepthBias : ShadowMapBias < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UISoftMax = 10.000; + float UIStep = 0.001; + string UIName = "Shadow Bias"; + int UIOrder = 103; +#endif +> = { 0.01f }; + +// flips back facing normals to improve lighting for things like sheets of hair or leaves +bool flipBackfaceNormals < + string UIGroup = "Lighting Settings"; + string UIName = "Double Sided Lighting"; + int UIOrder = 104; +> = true; + +// -- light props are inserted here via UIOrder 20 - 49 + +// --------------------------------------------- +// IBL Settings GROUP +// --------------------------------------------- + +float SkyRotation < + string UIGroup = "IBL Settings"; + string UIName = "Sky Rotation"; + float UISoftMin = 0; + float UISoftMax = 360; + float UIMin = 0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1; + int UIOrder = 105; + string UIWidget = "Slider"; +> = { 0.0f }; + +bool UseDiffuseIBLMap < + string UIGroup = "IBL Settings"; + string UIName = "Use Diffuse Cubemap"; + int UIOrder = 106; +> = false; + +float DiffuseIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Diffuse IBL Intensity"; + int UIOrder = 107; +> = 1.0; + +bool UseSpecCubeIBL < + string UIGroup = "IBL Settings"; + string UIName = "Use Specular Cubemap"; + int UIOrder = 109; +> = false; + +float SpecularIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Specular IBL Intensity"; + int UIOrder = 110; +> = 1.0; + +// --------------------------------------------- +// Diffuse GROUP +// --------------------------------------------- + +bool UseDiffuseTexture < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map"; + int UIOrder = 200; +> = false; + + +bool UseDiffuseTextureAlpha < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map Alpha"; + int UIOrder = 201; +> = false; + +float3 DiffuseColor : Diffuse < + string UIGroup = "Diffuse"; + string UIName = "Diffuse Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 202; +> = { 1.0f, 1.0f, 1.0f }; + +// --------------------------------------------- +// SSS GROUP +// --------------------------------------------- + +float skinCoeffX < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient R"; + int UIOrder = 204; +> = 1.0; + +float skinCoeffY < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient G"; + int UIOrder = 205; +> = 0.5; + +float skinCoeffZ < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient B"; + int UIOrder = 206; +> = 0.25; + +float NormalBlurring < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Softness"; + int UIOrder = 207; +> = 0.25; + +bool UseScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string UIName = "Use SSS Radius Map"; + int UIOrder = 209; +> = false; + +float skinScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Radius"; + int UIOrder = 210; +> = 0.25; + +float shadowBlur < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Blur"; + int UIOrder = 211; +> = 1.0; + +float shadowDither < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Dither"; + int UIOrder = 211; +> = 1.0; + +float shadowScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Scattering"; + int UIOrder = 212; +> = 1.0; + +float shadowSaturation < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 4.0; + float UIMax = 4; + float UIStep = 0.1; + string UIName = "SSS Shadow Saturation"; + int UIOrder = 213; +> = 1.0; + +// --------------------------------------------- +// BackScattering GROUP +// --------------------------------------------- + +bool UseTranslucency < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering"; + int UIOrder = 214; +> = false; + +bool UseThicknessTexture < + string UIGroup = "BackScattering"; + string UIName = "Use Thickness Map"; + int UIOrder = 216; +> = false; + +float skinScatteringRoughness < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Width"; + int UIOrder = 217; +> = 1.0; + +/*float3 skinScatteringInnerColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Inner Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 215; +> = {0.25f, 0.05f, 0.02f };*/ + +float3 skinScatteringOuterColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 218; +> = { 0.25f, 0.05f, 0.02f }; + +float skinScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Amount"; + int UIOrder = 219; +> = 1.0; + +float skinAmbientScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Ambient Amount"; + int UIOrder = 220; +> = 1.0; + +/* float skinScatteringPlane < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Far Plane"; + int UIOrder = 218; +> = 1.0;*/ + +// --------------------------------------------- +// Specular GROUP +// --------------------------------------------- + +bool UseSpecularTexture < + string UIGroup = "Specular"; + string UIName = "Use Specular Map"; + int UIOrder = 301; +> = false; + +bool UseSpecularTextureAlpha < + string UIGroup = "Specular"; + string UIName = "Use Roughness Map Alpha"; + int UIOrder = 301; +> = false; + +float3 SpecularColor : Specular < + string UIGroup = "Specular"; + string UIName = "Specular Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 303; +> = { 1.0f, 1.0f, 1.0f }; + + +float LobeMix < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Lobe Mixing"; + int UIOrder = 304; +> = 0.75; + +float Roughness < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Roughness multiplier"; + int UIOrder = 305; +> = .2; + +// --------------------------------------------- +// Occlusion GROUP +// --------------------------------------------- + +bool UseAmbientOcclusionTexture < + string UIGroup = "Occlusion"; + string UIName = "Use Occlusion Map"; + int UIOrder = 400; +> = false; + +float OcclusionAmount < + string UIGroup = "Occlusion"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Occlusion Amount"; + int UIOrder = 402; +> = 1.0; + +// --------------------------------------------- +// Cavity GROUP +// --------------------------------------------- + +bool UseCavityTexture < + string UIGroup = "Cavity"; + string UIName = "Use Cavity Map"; + int UIOrder = 500; +> = false; + +float CavityAmount < + string UIGroup = "Cavity"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Cavity Amount"; + int UIOrder = 502; +> = 1.0; + +// --------------------------------------------- +// Normal GROUP +// --------------------------------------------- +bool UseNormalTexture < + string UIGroup = "Normal"; + string UIName = "Use Normal Map"; + int UIOrder = 600; +> = false; + +float NormalHeight < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Normal Height"; + int UIOrder = 603; +> = 1.0; + +bool SupportNonUniformScale < + string UIGroup = "Normal"; + string UIName = "Support Non-Uniform Scale"; + int UIOrder = 604; +> = true; + +int NormalCoordsysX < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal X (Red)"; + int UIOrder = 605; +> = 0; + +int NormalCoordsysY < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal Y (Green)"; + int UIOrder = 606; +> = 0; + +// --------------------------------------------- +// Micro Details GROUP +// --------------------------------------------- + +bool UseMicroCavityTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Cavity Map"; + int UIOrder = 700; +> = false; + +float MicroCavityAmount < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Cavity Amount"; + int UIOrder = 702; +> = 1.0; + +bool UseMicroNormalTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Normal Map"; + int UIOrder = 703; +> = false; + +float MicroNormalHeight < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Normal Height"; + int UIOrder = 705; +> = 1.0; + +float MicroScale < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 16.0; + float UISoftMax = 256.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Scale"; + int UIOrder = 706; +> = 32; + +// --------------------------------------------- +// Opacity GROUP +// --------------------------------------------- +float Opacity : OPACITY < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity"; + int UIOrder = 801; +> = 1.0; + +bool UseOpacityMaskTexture < + string UIGroup = "Opacity"; + string UIName = "Opacity Mask"; + int UIOrder = 802; +> = false; + +// at what value do we clip away pixels +float OpacityMaskBias < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity Mask Bias"; + int UIOrder = 803; +> = 0.1; + +#ifdef _SUPPORTTESSELLATION_ +// --------------------------------------------- +// Tessellation and Displacement GROUP +// --------------------------------------------- +int DisplacementModel < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Model"; + string UIFieldNames = "Grayscale:Tangent Vector"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 900; +> = false; + +bool UseDisplacementMap < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Map"; + int UIOrder = 901; +> = false; + +int VectorDisplacementCoordSys < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + string UIFieldNames = "Mudbox (XZY):Maya (XYZ)"; + string UIName = "Displacement Coordsys"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 903; +> = 0; + +float DisplacementHeight < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 10.0; + string UIName = "Displacement Height"; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + int UIOrder = 904; +> = 0.5; + +// This allows you to control what the 'base' value for displacement is. +// When the offset value is 0.5, that means that a gray value (color: 128,128,128) will get 0 displacement. +// A value of 0 would then dent in. +// A value of 1 would then extrude. +float DisplacementOffset < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = -1.0; + float UISoftMax = 1.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + string UIName = "Displacement Offset"; + int UIOrder = 905; +> = 0.5; + +// This gives the artist control to prevent this shader from clipping away faces to quickly when displacement is actually keeping the faces on screen. +// This is also important for e.g. shadow map generation to make sure displaced vertices are not clipped out of the light's view +// See BBoxExtraScale for artist control over Maya clipping the entire object away when it thinks it leaves the view. +float DisplacementClippingBias < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 99.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Displacement Clipping Bias"; + int UIOrder = 906; +> = 5.0; + +// This gives the artist control to prevent maya from clipping away the entire object to fast in case displacement is used. +// Its semantic has to be BoundingBoxExtraScale +float BBoxExtraScale : BoundingBoxExtraScale < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Bounding Box Extra Scale"; + int UIOrder = 907; +> = 1.0; + +float TessellationRange < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 999.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1.0; + string UIName = "Tessellation Range"; + int UIOrder = 908; +> = { 0 }; + +float TessellationMin < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Tessellation Minimum"; + int UIOrder = 909; +> = 3.0; + +float FlatTessellation < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.1; + string UIName = "Flat Tessellation"; + int UIOrder = 910; +> = 0.0; +#endif + +// --------------------------------------------- +// UV assignment GROUP +// --------------------------------------------- +// Use the Surface Data Section to set your UVset names for each Texcoord. +// E.g. TexCoord1 = uv:UVset +// Then pick a Texcoord in the UV Section to use that UVset for a texture. + +int DiffuseTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Diffuse Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2002; +> = 0; + +int OcclusionTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Ambient Occlusion Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2003; +> = 1; + +int OpacityMaskTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Opacity Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2005; +> = 0; + +int SpecularTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Specular Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2006; +> = 0; + +int NormalTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Normal Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2008; +> = 0; + +#ifdef _SUPPORTTESSELLATION_ +int DisplacementTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Displacement Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2010; +> = 0; +#endif + +int ThicknessTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Translucency Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2011; +> = 0; +} //end UpdatePerObject cbuffer + +//------------------------------------ +// Light parameters +//------------------------------------ +cbuffer UpdateLights : register(b2) { +// --------------------------------------------- +// Light 0 GROUP +// --------------------------------------------- +// This value is controlled by Maya to tell us if a light should be calculated +// For example the artist may disable a light in the scene, or choose to see only the selected light +// This flag allows Maya to tell our shader not to contribute this light into the lighting +bool light0Enable : LIGHTENABLE < +string Object = "Light 0"; // UI Group for lights, auto-closed +string UIName = "Enable Light 0"; +int UIOrder = 20; +#ifdef _MAYA_ +> = false; // maya manages lights itself and defaults to no lights +#else +> = true; // in 3dsMax we should have the default light enabled +#endif + +// follows LightParameterInfo::ELightType +// spot = 2, point = 3, directional = 4, ambient = 5, +int light0Type : LIGHTTYPE < + string Object = "Light 0"; + string UIName = "Light 0 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + int UIOrder = 21; + float UIMin = 0; + float UIMax = 5; + float UIStep = 1; +> = 2; // default to spot so the cone angle etc work when "Use Shader Settings" option is used + +float3 light0Pos : POSITION < + string Object = "Light 0"; + string UIName = "Light 0 Position"; + string Space = "World"; + int UIOrder = 22; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +float3 light0Color : LIGHTCOLOR < + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Color"; + string UIWidget = "Color"; + int UIOrder = 23; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light0Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 24; +#endif +> = { 1.0f }; + +float3 light0Dir : DIRECTION < + string Object = "Light 0"; + string UIName = "Light 0 Direction"; + string Space = "World"; + int UIOrder = 25; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light0ConeAngle : HOTSPOT // In radians +#else +float light0ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 26; +#endif +> = { 0.46f }; + +#ifdef _MAYA_ +float light0FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light0FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 27; +#endif +> = { 0.7f }; + +float light0AttenScale : DECAYRATE < + string Object = "Light 0"; + string UIName = "Light 0 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 28; +> = { 0.0 }; + +bool light0ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 29; +#endif +> = true; + +float4x4 light0Matrix : SHADOWMAPMATRIX < + string Object = "Light 0"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 1 GROUP +// --------------------------------------------- +bool light1Enable : LIGHTENABLE < + string Object = "Light 1"; + string UIName = "Enable Light 1"; + int UIOrder = 30; +> = false; + +int light1Type : LIGHTTYPE < + string Object = "Light 1"; + string UIName = "Light 1 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 31; +> = 2; + +float3 light1Pos : POSITION < + string Object = "Light 1"; + string UIName = "Light 1 Position"; + string Space = "World"; + int UIOrder = 32; + int RefID = 1; // 3DSMAX +> = { -100.0f, 100.0f, 100.0f }; + +float3 light1Color : LIGHTCOLOR < + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Color"; + string UIWidget = "Color"; + int UIOrder = 33; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light1Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 34; +#endif +> = { 1.0f }; + +float3 light1Dir : DIRECTION < + string Object = "Light 1"; + string UIName = "Light 1 Direction"; + string Space = "World"; + int UIOrder = 35; + int RefID = 1; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light1ConeAngle : HOTSPOT // In radians +#else +float light1ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 36; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light1FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light1FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 37; +#endif +> = { 0.0f }; + +float light1AttenScale : DECAYRATE < + string Object = "Light 1"; + string UIName = "Light 1 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 38; +> = { 0.0 }; + +bool light1ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 39; +#endif +> = true; + +float4x4 light1Matrix : SHADOWMAPMATRIX < + string Object = "Light 1"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 2 GROUP +// --------------------------------------------- +bool light2Enable : LIGHTENABLE < + string Object = "Light 2"; + string UIName = "Enable Light 2"; + int UIOrder = 40; +> = false; + +int light2Type : LIGHTTYPE < + string Object = "Light 2"; + string UIName = "Light 2 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 41; +> = 2; + +float3 light2Pos : POSITION < + string Object = "Light 2"; + string UIName = "Light 2 Position"; + string Space = "World"; + int UIOrder = 42; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, -100.0f }; + +float3 light2Color : LIGHTCOLOR < + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Color"; + string UIWidget = "Color"; + int UIOrder = 43; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light2Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 44; +#endif +> = { 1.0f }; + +float3 light2Dir : DIRECTION < + string Object = "Light 2"; + string UIName = "Light 2 Direction"; + string Space = "World"; + int UIOrder = 45; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light2ConeAngle : HOTSPOT // In radians +#else +float light2ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 46; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light2FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light2FallOff : LIGHTFALLOFF +#endif +< +string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 47; +#endif +> = { 0.0f }; + +float light2AttenScale : DECAYRATE < + string Object = "Light 2"; + string UIName = "Light 2 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 48; +> = { 0.0 }; + +bool light2ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 49; +#endif +> = true; + +float4x4 light2Matrix : SHADOWMAPMATRIX < + string Object = "Light 2"; + string UIWidget = "None"; +>; + +} //end lights cbuffer + +//------------------------------------ +// Structs +//------------------------------------ +struct APPDATA { + float3 position : POSITION; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 normal : NORMAL; + float3 binormal : BINORMAL; + float3 tangent : TANGENT; +}; + +struct SHADERDATA { + float4 position : SV_Position; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 worldNormal : NORMAL; + float4 worldTangent : TANGENT; + float3 worldPosition : TEXCOORD3; + float4 screenCoord : TEXCOORD14; + +#ifdef _SUPPORTTESSELLATION_ + // Geometry generated control points: + // .worldPosition is CP0, so we don't need to store it again + float3 CP1 : TEXCOORD4; + float3 CP2 : TEXCOORD5; + + // PN-AEN with displacement fix: + float4 dominantEdge : TEXCOORD6; // both vertices of an edge + float2 dominantVertex : TEXCOORD7; // corner + + // Dominant normal and tangent for VDM crack fix: + // this could be compacted into less texcoords, but left as-is for readability + float3 dominantNormalE0 : TEXCOORD8; + float3 dominantNormalE1 : TEXCOORD9; + float3 dominantNormalCorner : TEXCOORD10; + + float3 dominantTangentE0 : TEXCOORD11; + float3 dominantTangentE1 : TEXCOORD12; + float3 dominantTangentCorner : TEXCOORD13; + + float clipped : CLIPPED; +#endif +}; + + +#ifdef _SUPPORTTESSELLATION_ +struct HSCONSTANTDATA { + float TessFactor[3] : SV_TessFactor; // tessellation amount for each edge of patch + float InsideTessFactor : SV_InsideTessFactor; // tessellation amount within a patch surface (would be float2 for quads) + float3 CPCenter : CENTER; // Geometry generated center control point +}; +#endif + +//------------------------------------ +// BRDF +//------------------------------------ + +float sqr(float x) { + return x*x; +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float D_Beckmann(float Roughness, float NoH) { + float m = Roughness; + float m2 = m * m; + + float NdotH2 = sqr(NoH); + return exp((NdotH2 - 1) / (m2 * NdotH2)) / (PI * m2 * NdotH2 * NdotH2); +} + +// This function is from Nvidia's Human Head demo +float D_BeckmannNVIDIA(float m, float ndoth) { + float alpha = acos(ndoth); + float ta = tan(alpha); + float val = 1.0 / (m*m*pow(ndoth, 4.0)) * exp(-(ta*ta) / (m*m)); + return val; +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_Schlick(float3 SpecularColor, float LdotH) { + return SpecularColor + (1.0f - SpecularColor) * exp2((-5.55473 * LdotH - 6.98316) * LdotH); +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2011, "Adopting a physically based shading model" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_LagardeSchlick(float3 SpecularColor, float Roughness, float NdotV) { + return SpecularColor + (max(1 - Roughness, SpecularColor) - SpecularColor) * exp2((-5.55473 * NdotV - 6.98316) * NdotV); +} + +float3 F_KelemenSzirmaykalos(float3 H, float3 V, float3 F0) { + float base = 1.0 - dot(V, H); + float exponential = pow(base, 5.0); + return exponential + F0 * (1.0 - exponential); +} + +float3 KelemenSzirmaykalos(float3 N, float3 L, float3 V, float roughness, float3 specular) { + float3 result = float3(0.0, 0.0, 0.0); + float NdotL = dot(N, L); + + if (NdotL > 0.0) { + float3 h = L + V; + float3 H = normalize(h); + float NdotH = dot(N, H); + float VdotH = dot(V, H); + float D = D_BeckmannNVIDIA(roughness, NdotH); + float3 F = F_Schlick(specular, VdotH); + float G = 1; + float3 specularDirect = max(D * G * F / dot(h, h), 0); + result = specularDirect * NdotL; // Specular is added for more tuning + } + return result; +} + +float3 PennerSkin(float3 skinCoef, float3 N, float3 L, float3 Nlow, float Curvature) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + pennerNdotL = saturate(pennerNdotL * 0.5 + 0.5); + + float3 pennerlookUp; + pennerlookUp.r = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.r, Curvature)).r; + pennerlookUp.g = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.g, Curvature)).g; + pennerlookUp.b = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.b, Curvature)).b; + + return pennerlookUp; +} + +float3 PennerSkinNoLUT(float3 skinCoef, float3 N, float3 L, float3 Nlow) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + + float3 pennerlookUp; + pennerlookUp.r = saturate(pennerNdotL.r*(float3(1, 1, 1).r - skinCoef.r) + skinCoef.r) * (1 - skinCoef.r); + pennerlookUp.g = saturate(pennerNdotL.g*(float3(1, 1, 1).g - skinCoef.g) + skinCoef.g) * (1 - skinCoef.g); + pennerlookUp.b = saturate(pennerNdotL.b*(float3(1, 1, 1).b - skinCoef.b) + skinCoef.b) * (1 - skinCoef.b); + + return pennerlookUp; +} + +float3 diffuseSkinIBL(float3 skinCoef, float3 diffuseIBL_HighFreq, float3 diffuseIBL_LowFreq) { + return lerp(diffuseIBL_HighFreq, diffuseIBL_LowFreq, skinCoef); +} + +//------------------------------------ +// Functions +//------------------------------------ + +float4 ComputeScreenPos(float4 pos) { +#if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; +#else + float scale = 1.0; +#endif + + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*scale) + o.w; + o.zw = pos.zw; + + return o; +} + +// Occlusion taking into account the color of the texture multiplied to it +float3 coloredOcclusion(float3 color, float occlusion) { + float3 coloredOcclusion = lerp(float3(1.0f, 1.0f, 1.0f), color, (1 - occlusion)); + //color *= coloredOcclusion; + return coloredOcclusion; +} + +float specularOcclusion(float3 N, float3 V, float Occlusion) { + const float specularPow = 5.0; + float NdotV = dot(N, V); + float s = saturate(-0.3 + NdotV * NdotV); + + return lerp(pow(Occlusion, specularPow), 1.0, s); +} + +float2 pickTexcoord(int index, float2 t0, float2 t1, float2 t2) { + float2 tcoord = t0; + + if (index == 1) { + tcoord = t1; + } else if (index == 2) { + tcoord = t2; + } + + return tcoord; +} + +float3 RotateVectorYaw(float3 vec, float degreeOfRotation) { + float3 rotatedVec = vec; + float angle = radians(degreeOfRotation); + + rotatedVec.x = (cos(angle) * vec.x) - (sin(angle) * vec.z); + rotatedVec.z = (sin(angle) * vec.x) + (cos(angle) * vec.z); + + return rotatedVec; +} + +// Spot light cone +float lightConeangle(float coneAngle, float coneFalloff, float3 lightVec, float3 lightDir) { + // the cone falloff should be equal or bigger then the coneAngle or the light inverts + // this is added to make manually tweaking the spot settings easier. + if (coneFalloff < coneAngle) { + coneFalloff = coneAngle; + } + + float LdotDir = dot(normalize(lightVec), lightDir); + + // cheaper cone, no fall-off control would be: + // float cone = pow(saturate(LdotDir), 1 / coneAngle); + + // higher quality cone (more expensive): + float cone = smoothstep(cos(coneFalloff), cos(coneAngle), LdotDir); + + return cone; +} + +#define SHADOW_FILTER_TAPS_CNT 10 + +float2 SuperFilterTaps[SHADOW_FILTER_TAPS_CNT] < string UIWidget = "None"; > = { + { -0.84052f, -0.073954f }, + { -0.326235f, -0.40583f }, + { -0.698464f, 0.457259f }, + { -0.203356f, 0.6205847f }, + { 0.96345f, -0.194353f }, + { 0.473434f, -0.480026f }, + { 0.519454f, 0.767034f }, + { 0.185461f, -0.8945231f }, + { 0.507351f, 0.064963f }, + { -0.321932f, 0.5954349f } +}; + +static float4 kernel[25] = { + { 0.530605, 0.613514, 0.739601, 0 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, -3 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, -2.52083 }, + { 0.00500364, 0.00020094, 5.28848e-005, -2.08333 }, + { 0.00700976, 0.00049366, 0.000151938, -1.6875 }, + { 0.0094389, 0.00139119, 0.000416598, -1.33333 }, + { 0.0128496, 0.00356329, 0.00132016, -1.02083 }, + { 0.017924, 0.00711691, 0.00347194, -0.75 }, + { 0.0263642, 0.0119715, 0.00684598, -0.520833 }, + { 0.0410172, 0.0199899, 0.0118481, -0.333333 }, + { 0.0493588, 0.0367726, 0.0219485, -0.1875 }, + { 0.0402784, 0.0657244, 0.04631, -0.0833333 }, + { 0.0211412, 0.0459286, 0.0378196, -0.0208333 }, + { 0.0211412, 0.0459286, 0.0378196, 0.0208333 }, + { 0.0402784, 0.0657244, 0.04631, 0.0833333 }, + { 0.0493588, 0.0367726, 0.0219485, 0.1875 }, + { 0.0410172, 0.0199899, 0.0118481, 0.333333 }, + { 0.0263642, 0.0119715, 0.00684598, 0.520833 }, + { 0.017924, 0.00711691, 0.00347194, 0.75 }, + { 0.0128496, 0.00356329, 0.00132016, 1.02083 }, + { 0.0094389, 0.00139119, 0.000416598, 1.33333 }, + { 0.00700976, 0.00049366, 0.000151938, 1.6875 }, + { 0.00500364, 0.00020094, 5.28848e-005, 2.08333 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, 2.52083 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, 3 } +}; + + +static float2 kernelRandom[32] = { + { 0.254395, 0.385445 }, + { -0.139177, 0.571074 }, + { -0.453510, 0.962140 }, + { 0.482684, 0.346190 }, + { 0.889741, 0.724799 }, + { -0.661047, -0.137344 }, + { -0.193311, -0.313475 }, + { 0.363177, -0.960291 }, + { -0.225866, -0.654962 }, + { 0.407875, 0.431522 }, + { -0.543008, -0.992827 }, + { -0.878493, -0.896999 }, + { -0.641776, 0.130757 }, + { -0.785279, -0.015190 }, + { 0.469054, 0.248633 }, + { -0.820410, -0.562833 }, + { 0.174019, -0.618069 }, + { -0.906449, -0.275099 }, + { -0.655285, -0.956021 }, + { 0.453776, -0.085425 }, + { -0.430788, -0.089530 }, + { -0.587370, -0.851826 }, + { 0.149056, -0.474322 }, + { 0.228684, 0.321661 }, + { -0.668752, -0.829400 }, + { -0.729554, 0.438250 }, + { -0.467018, -0.252882 }, + { 0.090398, 0.618760 }, + { 0.741840, 0.516401 }, + { -0.983891, 0.248701 }, + { -0.162010, -0.714455 }, + { 0.308825, 0.787175 } +}; + +float shadowMapTexelSize < string UIWidget = "None"; > = { 0.00195313 }; // (1.0f / 512) + +// Shadows: +// Percentage-Closer Filtering +float3 lightShadow(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size) { + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float shadowColored = 0; + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + float z = Pndc.z - shadowDepthBias / Pndc.w; + + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 32; ++i) { + float2 offset = kernelRandom[i] * shadowDepth * shadowMapTexelSize; + float2 ditherOffset = mul(offset, rotationMatrix); + ditherOffset = lerp(offset, ditherOffset, shadowDither); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + ditherOffset, 0).x; + + ditherShadow += (sample >= 0.0f) ? 0.0f : (1.0f / 32); + } + } + + return ditherShadow; +} + +float3 lightShadowSkin(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size, float2 dir) { + + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float3 shadowColored = float3(0, 0, 0); + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + + float z = Pndc.z - shadowDepthBias / Pndc.w; + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 25; ++i) { + float2 offset = kernel[i].a * dir * shadowDepth * shadowMapTexelSize; + offset = mul(offset, rotationMatrix); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + offset, 0).x; + ditherShadow = (sample >= 0.0f) ? 0.0f : 1.0f; + + shadowColored += ditherShadow * kernel[i].rgb; + } + } + + return shadowColored; +} + +#ifdef _SUPPORTTESSELLATION_ +// Pick dominant for crack free displacement (original function by Bryan Dudash, modified to support any float3) +float3 PickDominant(float3 vec, // vector to change + float U, float V, float W, // barycoords + float3 DE0A, float3 DE0B, // domimant edge 0 vertex A and B + float3 DE1A, float3 DE1B, // domimant edge 1 vertex A and B + float3 DE2A, float3 DE2B, // domimant edge 2 vertex A and B + float3 DV0, float3 DV1, float3 DV2) { // dominant corners + // Override the texture coordinates along the primitive edges and at the corners. + // Keep the original interpolated coords for the inner area of the primitive. + + float3 dominantVector = vec; + + float edgeThreshold = 0.0001f; + float edgeU = (U == 0) ? 1 : 0; + float edgeV = (V == 0) ? 1 : 0; + float edgeW = (W == 0) ? 1 : 0; + + float corner = ((edgeU + edgeV + edgeW) == 2) ? 1 : 0; // two are 0, means we are a corner + float edge = ((edgeU + edgeV + edgeW) == 1) ? 1 : 0; // one of them is 0, means we are an edge + float innerarea = ((edgeU + edgeV + edgeW) == 0) ? 1 : 0; // none are 0, means we are interior + + if (innerarea != 1) { + // Note: the order of the vertices/edges we choose here can be different per application + // and depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + if (corner) { + if (U > 1.0 - edgeThreshold) + dominantVector = DV1; + else if (V > 1.0 - edgeThreshold) + dominantVector = DV2; + else if (W > 1.0 - edgeThreshold) + dominantVector = DV0; + } else { + if (edgeU) + dominantVector = lerp(DE2A, DE2B, W); + else if (edgeV) + dominantVector = lerp(DE0A, DE0B, U); + else + dominantVector = lerp(DE1A, DE1B, V); + } + } + + return dominantVector; +} + +// outside of view? +float IsClipped(float4 clipPos) { + float W = clipPos.w + DisplacementClippingBias; // bias allows artist to control to early clipping due to displacement + // Test whether the position is entirely inside the view frustum. + return (-W <= clipPos.x && clipPos.x <= W && -W <= clipPos.y && clipPos.y <= W && -W <= clipPos.z && clipPos.z <= W) ? 0.0f : 1.0f; +} + +// Compute whether all three control points along the edge are outside of the view frustum. +// By doing this, we're ensuring that +// 1.0 means clipped, 0.0 means unclipped. +float ComputeClipping(float3 cpA, float3 cpB, float3 cpC) { + // Compute the projected position for each position, then check to see whether they are clipped. + float4 projPosA = mul(float4(cpA, 1), viewPrj), projPosB = mul(float4(cpB, 1), viewPrj), projPosC = mul(float4(cpC, 1), viewPrj); + return min(min(IsClipped(projPosA), IsClipped(projPosB)), IsClipped(projPosC)); +} + +// PN Triangles and PN-AEN control points: +float3 ComputeCP(float3 posA, float3 posB, float3 normA) { + return (2.0f * posA + posB - (dot((posB - posA), normA) * normA)) / 3.0f; +} +#endif + +// Clip pixel away when opacity mask is used +void OpacityMaskClip(float2 uv) { + if (UseOpacityMaskTexture) { + float OpacityMaskMap = OpacityMaskTexture.Sample(SamplerAnisoWrap, uv).x; + + // clip value when less then 0 for punch-through alpha. + clip(OpacityMaskMap < OpacityMaskBias ? -1 : 1); + } +} + + +// Calculate a light: +struct lightOut { + float Specular; + float3 Color; +}; + +lightOut CalculateLight(bool lightEnable, int lightType, float lightAtten, float3 lightPos, float3 vertWorldPos, + float3 lightColor, float lightIntensity, float3 lightDir, float lightConeAngle, float lightFallOff, float4x4 lightViewPrjMatrix, + uniform Texture2D lightShadowMap, bool lightShadowOn, float3 vertexNormal, float3 normal, float3 diffuseColorIn, + float3 eyeVec, float roughness, float3 specularColorIn, float3 thickness, float softenMask, + float gammaCorrection, float opacity, float3 ambientOcclusion, float3 skinOcclusion, float2 screenCoord, float2 size, float scatteringRadius) { + lightOut OUT = (lightOut)0; + + OUT.Specular = 0.0; + OUT.Color = float3(0, 0, 0); + + if (lightEnable) { + // For Maya, flip the lightDir: +#ifdef _MAYA_ + lightDir = -lightDir; +#endif + + bool isAmbientLight = (lightType == 5); + if (isAmbientLight) { + OUT.Color = diffuseColorIn * lightColor * lightIntensity; + OUT.Color.rgb *= ambientOcclusion; + return OUT; + } + + bool isDirectionalLight = (lightType == 4); + float3 lightVec = lerp(lightPos - vertWorldPos, lightDir, isDirectionalLight); + + float3 L = normalize(lightVec); + + // Diffuse: + float3 diffuseDirect = float3(0, 0, 0); + float3 scatter = float3(skinCoeffX, skinCoeffY, skinCoeffZ); + diffuseDirect = PennerSkin(scatter, normal, L, vertexNormal, 1 - (scatteringRadius*skinScattering)) * diffuseColorIn; + //diffuseDirect = PennerSkinNoLUT(scatter,normal,L, vertexNormal) * diffuseColorIn; + + // Specular: + float3 specularDirect = float3(0, 0, 0); + + float3 Lobe1 = KelemenSzirmaykalos(normal, L, eyeVec, roughness, specularColorIn); + float3 Lobe2 = KelemenSzirmaykalos(normal, L, eyeVec, roughness*0.5, specularColorIn); + + specularDirect = Lobe2 * LobeMix + Lobe1 * (1 - LobeMix); + + // Light Attenuation: + bool enableAttenuation = lightAtten > 0.0001f; + float attenuation = 1.0f; + if (!isDirectionalLight) { + attenuation = lerp(1.0, 1 / pow(length(lightVec), lightAtten), enableAttenuation); + } + + // Spot light Cone Angle: + float angle = 1; + if (lightType == 2) { + angle = lightConeangle(lightConeAngle, lightFallOff, lightVec, lightDir); + } + + // Shadows: + float shadow = 1; + float3 skinShadow = float3(1, 1, 1); + float3 softShadow = float3(1, 1, 1); + if (UseShadows && lightShadowOn) { + shadow = lightShadow(lightViewPrjMatrix, lightShadowMap, vertWorldPos, screenCoord, shadowBlur, size); + + skinShadow = LutTexture.Sample(SamplerAnisoClamp, float2(shadow * angle, 1 - shadowScattering)); + skinShadow = lerp(dot(float3(0.33, 0.59, 0.11), skinShadow), skinShadow, shadowSaturation); + skinShadow = lerp(skinShadow, 1, (shadow* angle)*(shadow* angle)*(shadow* angle)); + } + + float3 lightAttenuation = lightIntensity * angle * attenuation * lightColor; + + diffuseDirect *= lightIntensity * skinShadow * attenuation * lightColor; + specularDirect *= lightAttenuation * shadow; + + float3 backScattering = float3(0, 0, 0); + if (UseTranslucency) { + half backRoughness = (1 - skinScatteringRoughness) * 128; + float3 viewScattering = exp2(saturate(dot(eyeVec, -(L + (normal * 0.01)))) * backRoughness - backRoughness) * skinScatteringAmount; + float3 lightScattering = saturate(dot(-L, normal)*0.5 + 0.5) * skinAmbientScatteringAmount; + + //float3 IBLScattering = diffuseIBL; + backScattering = (viewScattering + lightScattering) * lightAttenuation * shadow * thickness; + + float3 profile = skinScatteringOuterColor * backScattering; + backScattering = profile * skinScatteringAmount; + + + /*float scale = 2e4 * (1.0 - skinScatteringAmount) / backRoughness; + + float4 shrinkedPos = float4(vertWorldPos - 0.005 * vertexNormal, 1.0); + + float4 shadowPosition = mul(shrinkedPos, lightViewPrjMatrix); + + float d1 = lightShadowMap.Sample(SamplerShadowDepth, shadowPosition.xy / shadowPosition.w); // 'd1' has a range of 0..1 + + float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane' + d1 *= skinScatteringPlane*shadowPosition.w; // So we scale 'd1' accordingly: + float d = scale * abs(d1 - d2); + + float dd = -d * d; + float3 profile = float3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + float3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + float3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + float3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + float3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + float3(0.078, 0.0, 0.0) * exp(dd / 7.41); + backScattering = profile * saturate((0.3 + dot(L, -vertexNormal)) / 1.3) * thickness * diffuseColorIn; */ + } + + OUT.Color += diffuseDirect * skinOcclusion; + OUT.Color *= opacity; + OUT.Color += specularDirect * ambientOcclusion + backScattering; + + // Output specular and rim for opacity: + // OUT.Specular = dot(saturate(specularColor), float3(0.3f, 0.6f, 0.1f)); + } // end if light enabled + + return OUT; +} + +//------------------------------------ +// vertex shader with tessellation +//------------------------------------ +// take inputs from 3d-app +// vertex animation/skinning would happen here +SHADERDATA vt(APPDATA IN) { + SHADERDATA OUT = (SHADERDATA)0; + + // we pass vertices in world space + float4 worldPos = mul(float4(IN.position, 1), world); + OUT.worldPosition.xyz = worldPos.xyz; + +#ifdef _SUPPORTTESSELLATION_ + OUT.position = worldPos; +#else + OUT.position = float4(IN.position.xyz, 1); +#endif + + OUT.screenCoord = mul(float4(OUT.position.xyz, 1), viewPrj); + + // Pass through texture coordinates + // flip Y for Maya +#ifdef _MAYA_ + OUT.texCoord0 = float2(IN.texCoord0.x, (1.0 - IN.texCoord0.y)); + OUT.texCoord1 = float2(IN.texCoord1.x, (1.0 - IN.texCoord1.y)); + OUT.texCoord2 = float2(IN.texCoord2.x, (1.0 - IN.texCoord2.y)); +#else + OUT.texCoord0 = IN.texCoord0; + OUT.texCoord1 = IN.texCoord1; + OUT.texCoord2 = IN.texCoord2; +#endif + + // output normals in world space: + if (!SupportNonUniformScale) { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)world)); + } else { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)worldIT)); + } + + // output tangent in world space: + if (!SupportNonUniformScale) { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)world)); + } else { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)worldIT)); + } + + // store direction for normal map: + OUT.worldTangent.w = 1; + if (dot(cross(IN.normal.xyz, IN.tangent.xyz), IN.binormal.xyz) < 0.0) { + OUT.worldTangent.w = -1; + } + + return OUT; +} + + +//------------------------------------ +// vertex shader without tessellation +//------------------------------------ +SHADERDATA v(APPDATA IN) { + SHADERDATA OUT = vt(IN); + + // If we don't use tessellation, pass vertices in clip space: +#ifdef _SUPPORTTESSELLATION_ + OUT.position = mul(float4(OUT.position.xyz, 1), viewPrj); +#else + OUT.position = mul(float4(IN.position, 1), wvp); +#endif + + return OUT; +} + +#ifdef _SUPPORTTESSELLATION_ +//------------------------------------ +// hull shader +//------------------------------------ +// executed once per control point. +// control points can be considered the original vertices of the mesh +// outputs a control point +// run parallel with hull constant function +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_cw")] +[patchconstantfunc("HS_Constant")] +[outputcontrolpoints(3)] +[maxtessfactor(64.0)] + +// PN-AEN without displacement fix: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + +// PN Triangles, no crack fixes: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + + +// PN-AEN and displacement fix +// the index buffer is made up as follows: +// the triangle vertices index (int3) // PNAEN9 and PNAEN18 +// the 3 adjacent edges vertices index (3 * int2) // PNAEN9 and PNAEN18 +// the 3 dominant edges vertices index (3 * int2) // PNAEN18 +// the dominant position vertices index (int3) // PNAEN18 +SHADERDATA HS(InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID) { + SHADERDATA OUT = (SHADERDATA)0; + + // copy everything first: + OUT = IN[index]; + + // Compute the next output control point ID so we know which edge we're on. + const uint nextIndex = index < 2 ? index + 1 : 0; // (index + 1) % 3 + + // PN-AEN 9 and 18: + const uint neighborIndex = 3 + 2 * index; + const uint neighborNextIndex = neighborIndex + 1; + float3 myCP, neighborCP; + + // Calculate original PN control points and neighbors'. Then average. + myCP = ComputeCP(IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + neighborCP = ComputeCP(IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldNormal); + OUT.CP1 = (myCP + neighborCP) / 2; + + myCP = ComputeCP(IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + neighborCP = ComputeCP(IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldNormal); + OUT.CP2 = (myCP + neighborCP) / 2; + + // PN Triangles only would be: + // OUT.CP1 = ComputeCP( IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + // OUT.CP2 = ComputeCP( IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + + // Clipping: + OUT.clipped = ComputeClipping(OUT.worldPosition, OUT.CP1, OUT.CP2); + + // PN-AEN discontinuity code for displacement UVs: + const uint dominantEdgeIndex = 9 + 2 * index; + const uint dominantEdgeNextIndex = dominantEdgeIndex + 1; + const uint dominantVertexIndex = 15 + index; + + // Note: the order of the vertices/edges we choose here can be different per application and + // depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + float2 dominantEdgeUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeIndex].texCoord0, IN[dominantEdgeIndex].texCoord1, IN[dominantEdgeIndex].texCoord2); + float2 dominantEdgeNextUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeNextIndex].texCoord0, IN[dominantEdgeNextIndex].texCoord1, IN[dominantEdgeNextIndex].texCoord2); + float2 dominantVertexUV = pickTexcoord(DisplacementTexcoord, IN[dominantVertexIndex].texCoord0, IN[dominantVertexIndex].texCoord1, IN[dominantVertexIndex].texCoord2); + + OUT.dominantEdge = float4(dominantEdgeNextUV, dominantEdgeUV); + OUT.dominantVertex = dominantVertexUV; + + // VDM dominant normal and tangent for displacement crack fix: + OUT.dominantNormalE0 = IN[dominantEdgeNextIndex].worldNormal.xyz; + OUT.dominantNormalE1 = IN[dominantEdgeIndex].worldNormal.xyz; + OUT.dominantNormalCorner = IN[dominantVertexIndex].worldNormal.xyz; + + OUT.dominantTangentE0 = IN[dominantEdgeNextIndex].worldTangent.xyz; + OUT.dominantTangentE1 = IN[dominantEdgeIndex].worldTangent.xyz; + OUT.dominantTangentCorner = IN[dominantVertexIndex].worldTangent.xyz; + + return OUT; +} + +//------------------------------------ +// Hull shader constant function +//------------------------------------ +// executed once per patch +// outputs user defined data per patch and tessellation factor +// calculates control points for vertex and normal and passes to domain +// This hull shader passes the tessellation factors through to the HW tessellator, +// run parallel with hull function +HSCONSTANTDATA HS_Constant(const OutputPatch IN, uint patchID : SV_PrimitiveID) { + HSCONSTANTDATA OUT = (HSCONSTANTDATA)0; + + // future todo: + // triangle is on silhouette? + // triangle is facing camera? If facing backwards, reduce tessellation + // triangle lies in high frequency area of displacement map (density-based tessellation)? + + // Now setup the PNTriangle control points... + // Center control point + float3 f3E = (IN[0].CP1 + IN[0].CP2 + IN[1].CP1 + IN[1].CP2 + IN[2].CP1 + IN[2].CP2) / 6.0f; + float3 f3V = (IN[0].worldPosition + IN[1].worldPosition + IN[2].worldPosition) / 3.0f; + OUT.CPCenter = f3E + ((f3E - f3V) / 2.0f); + + // Clipping: + float4 centerViewPos = mul(float4(OUT.CPCenter, 1), viewPrj); + bool centerClipped = IsClipped(centerViewPos); + + if (IN[0].clipped && IN[1].clipped && IN[2].clipped && centerClipped) { + // If all control points are clipped, the surface cannot possibly be visible. + // Not entirely true, because displacement mapping can make them visible in the domain shader + // so we provide the user with a bias factor to avoid clipping too early + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = 0; + } else { + // Camera based tessellation, per object. So very basic. + float3 CameraPosition = viewInv[3].xyz; + float LengthOp = length((CameraPosition - world[3].xyz)); + float DivOp = (TessellationRange / LengthOp); + float MaxOp = max(TessellationMin + DivOp, 1); + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = MaxOp; + } + + // Inside tess factor is just the average of the edge factors + OUT.InsideTessFactor = (OUT.TessFactor[0] + OUT.TessFactor[1] + OUT.TessFactor[2]) / 3.0f; + + return OUT; +} + +//------------------------------------ +// domain shader +//------------------------------------ +// outputs the new vertices based on previous tessellation. +// also calculates new normals and uvs +// This domain shader applies contol point weighting to the barycentric coords produced by the FF tessellator +// If you wanted to do any vertex lighting, it would have to happen here. +[domain("tri")] +SHADERDATA DS(HSCONSTANTDATA HSIN, OutputPatch IN, float3 f3BarycentricCoords : SV_DomainLocation) { + SHADERDATA OUT = (SHADERDATA)0; + + // The barycentric coordinates + float fU = f3BarycentricCoords.x; + float fV = f3BarycentricCoords.y; + float fW = f3BarycentricCoords.z; + + // Precompute squares and squares * 3 + float fUU = fU * fU; + float fVV = fV * fV; + float fWW = fW * fW; + float fUU3 = fUU * 3.0f; + float fVV3 = fVV * 3.0f; + float fWW3 = fWW * 3.0f; + + // PN position: + float3 position = IN[0].worldPosition * fWW * fW + + IN[1].worldPosition * fUU * fU + + IN[2].worldPosition * fVV * fV + + IN[0].CP1 * fWW3 * fU + + IN[0].CP2 * fW * fUU3 + + IN[2].CP2 * fWW3 * fV + + IN[1].CP1 * fUU3 * fV + + IN[2].CP1 * fW * fVV3 + + IN[1].CP2 * fU * fVV3 + + HSIN.CPCenter * 6.0f * fW * fU * fV; + + // Flat position: + float3 flatPosition = IN[0].worldPosition * fW + IN[1].worldPosition * fU + IN[2].worldPosition * fV; + + // allow user to blend between PN tessellation and flat tessellation: + position = lerp(position, flatPosition, FlatTessellation); + + // Interpolate normal + float3 normal = IN[0].worldNormal * fW + IN[1].worldNormal * fU + IN[2].worldNormal * fV; + + // Normalize the interpolated normal + OUT.worldNormal = normalize(normal); + + // Compute tangent: + float3 tangent = IN[0].worldTangent.xyz * fW + IN[1].worldTangent.xyz * fU + IN[2].worldTangent.xyz * fV; + OUT.worldTangent.xyz = normalize(tangent.xyz); + + // Pass through the direction of the binormal as calculated in the vertex shader + OUT.worldTangent.w = IN[0].worldTangent.w; + + // Linear interpolate the texture coords + OUT.texCoord0 = IN[0].texCoord0 * fW + IN[1].texCoord0 * fU + IN[2].texCoord0 * fV; + OUT.texCoord1 = IN[0].texCoord1 * fW + IN[1].texCoord1 * fU + IN[2].texCoord1 * fV; + OUT.texCoord2 = IN[0].texCoord2 * fW + IN[1].texCoord2 * fU + IN[2].texCoord2 * fV; + + // apply displacement map (only when not rendering the Maya preview swatch): + if (UseDisplacementMap && !IsSwatchRender) { + // Fix Displacement Seams. + // we assume here that the displacement UVs is UVset 0. + // if this UVset index is changed, it should als be changed in the hull shader + // PN-AEN 18 with displacement UV seam fix + float2 displaceUV = pickTexcoord(DisplacementTexcoord, OUT.texCoord0, OUT.texCoord1, OUT.texCoord2); + float3 displacementUVW = PickDominant(float3(displaceUV, 0), fU, fV, fW, + float3(IN[0].dominantEdge.xy, 0), float3(IN[0].dominantEdge.zw, 0), + float3(IN[1].dominantEdge.xy, 0), float3(IN[1].dominantEdge.zw, 0), + float3(IN[2].dominantEdge.xy, 0), float3(IN[2].dominantEdge.zw, 0), + float3(IN[0].dominantVertex.xy, 0), + float3(IN[1].dominantVertex.xy, 0), + float3(IN[2].dominantVertex.xy, 0)); + + // We can still get cracks here because the world tangent and normal may be different for vertices on each side of the UV seam, + // because we do the tangent to world conversion, we get the same diplacement amount, but it results in different movement once converted to world space. + // And even a tiny difference between normal or tangent will cause large cracks. + float3 displacementNormal = PickDominant(OUT.worldNormal, + fU, fV, fW, + IN[0].dominantNormalE0, IN[0].dominantNormalE1, + IN[1].dominantNormalE0, IN[1].dominantNormalE1, + IN[2].dominantNormalE0, IN[2].dominantNormalE1, + IN[0].dominantNormalCorner, + IN[1].dominantNormalCorner, + IN[2].dominantNormalCorner); + + displacementNormal = normalize(displacementNormal); + + if (DisplacementModel == 1) { // Tangent Vector Displacement + float3 displacementTangent = PickDominant(OUT.worldTangent.xyz, fU, fV, fW, + IN[0].dominantTangentE0, IN[0].dominantTangentE1, + IN[1].dominantTangentE0, IN[1].dominantTangentE1, + IN[2].dominantTangentE0, IN[2].dominantTangentE1, + IN[0].dominantTangentCorner, + IN[1].dominantTangentCorner, + IN[2].dominantTangentCorner); + + displacementTangent = normalize(displacementTangent); + + float3 vecDisp = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).xyz; + vecDisp -= DisplacementOffset; + + float3 Bn = cross(displacementNormal, displacementTangent); + float3x3 toWorld = float3x3(displacementTangent, Bn.xyz, displacementNormal); + + float3 VDMcoordSys = vecDisp.xzy; // Mudbox + if (VectorDisplacementCoordSys == 1) { + VDMcoordSys = vecDisp.xyz; // Maya or ZBrush + } + + float3 vecDispW = mul(VDMcoordSys, toWorld) * DisplacementHeight; + position.xyz += vecDispW; + } else { + // offset (-0.5) so that we can have negative displacement also + float offset = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).x - DisplacementOffset; + position.xyz += displacementNormal * offset * DisplacementHeight; + } + } + + // Update World Position value for inside pixel shader: + OUT.worldPosition = position.xyz; + + // Transform model position with view-projection matrix + //OUT.position = float4(position.xyz, 1); // with geo + OUT.position = mul(float4(position.xyz, 1), viewPrj); // without geo + + return OUT; +} + +//------------------------------------ +// Geometry Shader +//------------------------------------ +// This is a sample Geo shader. Disabled in this shader, but left here for your reference. +// If you wish to enable it, search for 'with geo' in this shader for code to change. +[maxvertexcount(3)] // Declaration for the maximum number of vertices to create +void GS(triangle SHADERDATA IN[3], inout TriangleStream TriStream) { + SHADERDATA OUT; + + // quick test to see if geo also works: + for (int i = 0; i<3; ++i) { + OUT = IN[i]; + OUT.position = mul(mul(float4(OUT.position.xyz, 1), view), prj); + TriStream.Append(OUT); + } + TriStream.RestartStrip(); // end triangle +} +#endif + +void sampleMasks() { + +} + +//------------------------------------ +// pixel shader +//------------------------------------ +float4 f(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) : SV_Target { +#ifdef _3DSMAX_ + FrontFace = !FrontFace; +#endif + // clip are early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float gammaCorrection = lerp(1.0, 2.2, LinearSpaceLighting); + + float3 N = normalize(IN.worldNormal.xyz); + if (flipBackfaceNormals) { + N = lerp(-N, N, FrontFace); + } + float3 Nw = N; + + // Tangent and BiNormal: + float3 T = normalize(IN.worldTangent.xyz); + float3 Bn = cross(N, T); + Bn *= IN.worldTangent.w; + + float4 diffuse = float4(1, 1, 1, 1); + if (UseDiffuseTexture) { + float2 diffuseUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 diffuseTextureSample = DiffuseTexture.Sample(SamplerAnisoWrap, diffuseUV); + + if (UseDiffuseTextureAlpha) { + diffuse.a = diffuseTextureSample.a; + } + + diffuse.rgb *= pow(diffuseTextureSample.rgb, gammaCorrection); + } + + float3 microNormal = float3(0, 0, 1); + if (UseNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(NormalTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 NormalMap = NormalTexture.Sample(SamplerAnisoWrap, normalUV).xyz * 2.0 - 1.0; + float3 backupNormal = NormalMap; + + if (NormalCoordsysX > 0) + NormalMap.x = -NormalMap.x; + if (NormalCoordsysY > 0) + NormalMap.y = -NormalMap.y; + + NormalMap.xy *= NormalHeight; + + if (UseMicroNormalTexture) { + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + NormalMap.xy += microNormal.xy; + } + + if (UseBlendTexture) { + float2 blendUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + + + + + + + } + NormalMap = mul(NormalMap.xyz, toWorld); + N = normalize(NormalMap); + } else { + if (UseMicroNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + microNormal = mul(microNormal.xyz, toWorld); + } + } + + diffuse.rgb *= DiffuseColor; + + float3 blurredNormal = lerp(N, Nw, NormalBlurring); + + float3 V = normalize(viewInv[3].xyz - IN.worldPosition.xyz); + + float4 specular = float4(0.028, 0.028, 0.028, 1); + specular.rgb *= SpecularColor; + + if (UseSpecularTexture) { + float2 opacityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 SpecularTextureSample = SpecularTexture.Sample(SamplerAnisoWrap, opacityUV); + + specular.rgb *= pow(SpecularTextureSample.rgb, gammaCorrection); + + if (UseSpecularTextureAlpha) { + specular.a = SpecularTextureSample.a; + } + } + + float cavity = 1; + if (UseCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float CavityTextureSample = CavityTexture.Sample(SamplerAnisoWrap, cavityUV); + + cavity = lerp(1, pow(CavityTextureSample, gammaCorrection), CavityAmount); + } + + float microCavity = 1; + if (UseMicroCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float MicroCavityTextureSample = MicroCavityTexture.Sample(SamplerAnisoWrap, cavityUV * MicroScale); + + microCavity = lerp(1, pow(MicroCavityTextureSample, gammaCorrection), MicroCavityAmount); + } + + specular.rgb *= cavity * microCavity; // We apply cavity on the specular before it is sent to the fresnel + + float roughness = Roughness; + if (UseSpecularTextureAlpha) { + roughness *= specular.a; + } + + float scatteringRadius = 1; + if (UseScatteringRadiusTexture) { + float2 scatteringUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 scatteringRadiusTextureSample = ScatteringRadiusTexture.Sample(SamplerAnisoWrap, scatteringUV); + + scatteringRadius *= pow(scatteringRadiusTextureSample, gammaCorrection); + } + + // Opacity: + float opacity = saturate(diffuse.a * Opacity); + + // Occlusion: + float3 ambientOcclusion = float3(1, 1, 1); + if (UseAmbientOcclusionTexture) { + float2 aomapUV = pickTexcoord(OcclusionTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 aomapTextureSample = OcclusionTexture.Sample(SamplerAnisoWrap, aomapUV).rgb; + ambientOcclusion *= lerp(1, pow(aomapTextureSample.rgb, gammaCorrection), OcclusionAmount); + } + + float3 thickness = float3(1, 1, 1); + if (UseThicknessTexture) { + float2 thicknessUV = pickTexcoord(ThicknessTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + thickness = pow(BackScatteringThicknessTexture.Sample(SamplerAnisoWrap, thicknessUV), gammaCorrection).xyz; + } + + float3 skinOcclusion = coloredOcclusion(diffuse, ambientOcclusion); // Colored occlusion for skin + + float softenMask = 1.0f; + + float2 screenCoord = IN.screenCoord.xy / IN.screenCoord.w; + //float2 currentScreenSize = screenSize; // TO DO FIND A WAY TO GET SCREEN SIZE, MAYA BUG ? + float2 currentScreenSize = float2(1024, 512); + + // -------- + // LIGHTS: + // -------- + // future todo: Maya could pass light info in array so we can loop any number of lights. + + // light 0: + lightOut light0 = CalculateLight(light0Enable, light0Type, light0AttenScale, light0Pos, IN.worldPosition.xyz, + light0Color, light0Intensity, light0Dir, light0ConeAngle, light0FallOff, light0Matrix, + light0ShadowMap, light0ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 1: + lightOut light1 = CalculateLight(light1Enable, light1Type, light1AttenScale, light1Pos, IN.worldPosition.xyz, + light1Color, light1Intensity, light1Dir, light1ConeAngle, light1FallOff, light1Matrix, + light1ShadowMap, light1ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 2: + lightOut light2 = CalculateLight(light2Enable, light2Type, light2AttenScale, light2Pos, IN.worldPosition.xyz, + light2Color, light2Intensity, light2Dir, light2ConeAngle, light2FallOff, light2Matrix, + light2ShadowMap, light2ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + float3 lightTotal = light0.Color + light1.Color + light2.Color; + + + // ---------------------- + // IMAGE BASED LIGHTING + // ---------------------- + + // Specular IBL + float3 specularIBL = float3(0, 0, 0); + bool reflectMapUsed = UseSpecCubeIBL; + if (reflectMapUsed) { + int lod = 7; // Hard coded mip map level + + float3 reflectionVector = reflect(-V, N); + + reflectionVector = RotateVectorYaw(reflectionVector, SkyRotation); + reflectionVector = normalize(reflectionVector); + float NdotV = saturate(dot(N, V)); + float3 F = F_LagardeSchlick(specular, 1 - roughness, NdotV); + + specularIBL += SpecularCubeIBL.SampleLevel(CubeMapSampler, reflectionVector, lod * roughness).rgb * F; + } + + // Diffuse IBL + float3 diffuseIBL = float3(0, 0, 0); + bool useDiffuseIBL = UseDiffuseIBLMap; + if (useDiffuseIBL) { + // We use the world normal to sample the lighting texture + float3 diffuseIBLVec_High = N; + float3 diffuseIBLVec_Low = blurredNormal; + + diffuseIBLVec_High = RotateVectorYaw(diffuseIBLVec_High, SkyRotation); + diffuseIBLVec_High = normalize(diffuseIBLVec_High); + + diffuseIBLVec_Low = RotateVectorYaw(diffuseIBLVec_Low, SkyRotation); + diffuseIBLVec_Low = normalize(diffuseIBLVec_Low); + + float3 diffuseIBL_High = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_High, 0).rgb; + float3 diffuseIBL_Low = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_Low, 0).rgb; + + diffuseIBL = diffuseSkinIBL(float3(skinCoeffX, skinCoeffY, skinCoeffZ), diffuseIBL_High, diffuseIBL_Low); + } + + // ---------------------- + // FINAL COLOR AND ALPHA: + // ---------------------- + + float3 result = float3(0, 0, 0); + + result += diffuse * diffuseIBL * DiffuseIBLIntensity * skinOcclusion; + + result += specularIBL * SpecularIBLIntensity * specularOcclusion(N, V, ambientOcclusion); + + result += lightTotal; + + //result = N; + + // do gamma correction in shader: + if (!MayaFullScreenGamma) + result = pow(result, 1 / gammaCorrection); + + // final alpha: + float transparency = opacity; + transparency = saturate(transparency); // keep 0-1 range + + return float4(result, transparency); +} + + +#ifdef _MAYA_ +void Peel(SHADERDATA IN) { + float currZ = abs(mul(float4(IN.worldPosition, 1.0f), view).z); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + float2 UV = Pndc.xy / Pndc.w * float2(0.5f, -0.5f) + 0.5f; + float prevZ = transpDepthTexture.Sample(SamplerShadowDepth, UV).r; + float opaqZ = opaqueDepthTexture.Sample(SamplerShadowDepth, UV).r; + float bias = 0.00002f; + + if (currZ < prevZ * (1.0f + bias) || currZ > opaqZ * (1.0f - bias)) { + discard; + } +} + +float4 LinearDepth(SHADERDATA IN) { + return abs(mul(float4(IN.worldPosition, 1.0f), view).z); +} + +float4 DepthComplexity(float opacity) { + return opacity > 0.001f ? 1.0f : 0.0f; +} + +struct MultiOut2 { + float4 target0 : SV_Target0; + float4 target1 : SV_Target1; +}; + +MultiOut2 fTransparentPeel(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = LinearDepth(IN); + return OUT; +} + +MultiOut2 fTransparentPeelAndAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +MultiOut2 fTransparentWeightedAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +//------------------------------------ +// wireframe pixel shader +//------------------------------------ +float4 fwire(SHADERDATA IN) : SV_Target { + return float4(0, 0, 1, 1); +} + + +//------------------------------------ +// pixel shader for shadow map generation +//------------------------------------ +//float4 ShadowMapPS( float3 Pw, float4x4 shadowViewProj ) +float4 ShadowMapPS(SHADERDATA IN) : SV_Target { + // clip as early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + + // divide Z and W component from clip space vertex position to get final depth per pixel + float retZ = Pndc.z / Pndc.w; + + retZ += fwidth(retZ); + return retZ.xxxx; +} +#endif + +//----------------------------------- +// Objects without tessellation +//------------------------------------ +technique11 TessellationOFF < + bool overridesDrawState = false; // we do not supply our own render state settings + int isTransparent = 3; + // objects with clipped pixels need to be flagged as isTransparent to avoid the occluding underlying geometry since Maya renders the object with flat shading when computing depth + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + // 'VariableNameAsAttributeName = false' can be used to tell Maya's DX11ShaderNode to use the UIName annotation string for the Maya attribute name instead of the shader variable name. + // When changing this option, the attribute names generated for the shader inside Maya will change and this can have the side effect that older scenes have their shader attributes reset to default. + // bool VariableNameAsAttributeName = false; + +#ifdef _MAYA_ + // Tells Maya that the effect supports advanced transparency algorithm, + // otherwise Maya would render the associated objects simply by alpha + // blending on top of other objects supporting advanced transparency + // when the viewport transparency algorithm is set to depth-peeling or + // weighted-average. + bool supportsAdvancedTransparency = true; +#endif +> +{ + pass p0 < string drawContext = "colorPass"; > { // tell maya during what draw context this shader should be active, in this case 'Color' + // even though overrideDrawState is false, we still set the pre-multiplied alpha state here in + // case Maya is using 'Depth Peeling' transparency algorithm + // This unfortunately won't solve sorting issues, but at least our object can draw transparent. + // If we don't set this, the object will always be opaque. + // In the future, hopefully ShaderOverride nodes can participate properly in Maya's Depth Peeling setup +#ifdef _MAYA_ + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); +#endif + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, f())); + } + +#ifdef _MAYA_ + pass pTransparentPeel < string drawContext = "transparentPeel"; > { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +#endif +} + +#ifdef _SUPPORTTESSELLATION_ +//----------------------------------- +// Objects with tessellation +//------------------------------------ +// Vertex Index Buffer options: +// index_buffer_type: None; // no divergent normals and no displacement crack fix +// index_buffer_type: PNAEN9; // divergent normals crack fix; no displacement UV seam crack fix +// index_buffer_type: PNAEN18, // crack fix for divergent normals and UV seam displacement +technique11 TessellationON < + string index_buffer_type = "PNAEN18"; // tell Maya what type of index buffer we want. Must be unique name per generator + bool overridesDrawState = false; + int isTransparent = 3; + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + bool supportsAdvancedTransparency = true; > { + pass p0 < string drawContext = "colorPass"; > { + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, f())); + } + + pass pTransparentPeel < string drawContext = "transparentPeel";> { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +} + +//----------------------------------- +// Wireframe +//------------------------------------ +technique11 WireFrame < + string index_buffer_type = "PNAEN18"; + bool overridesDrawState = false; // since we only change the fillMode, it can remain on false. If we changed the blend state, it would have to be true + int isTransparent = 0; > { + pass p0 < string drawContext = "colorPass"; > { + SetRasterizerState(WireframeCullFront); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, fwire())); + } +} +#endif diff --git a/data/shaders/dx11_shd_eyeRight.fx b/data/shaders/dx11_shd_eyeRight.fx new file mode 100644 index 00000000..6b745418 --- /dev/null +++ b/data/shaders/dx11_shd_eyeRight.fx @@ -0,0 +1,2872 @@ +// Maya Skin shader made by Charles Greivelding 2014 + +//------------------------------------ +// Notes +//------------------------------------ +// Shader uses 'pre-multiplied alpha' as its render state and this Uber Shader is build to work in unison with that. +// Alternatively, in Maya, the dx11Shader node allows you to set your own render states by supplying the 'overridesDrawState' annotation in the technique +// You may find it harder to get proper transparency sorting if you choose to do so. + +// The technique annotation 'isTransparent' is used to tell Maya how treat the technique with respect to transparency. +// - If set to 0 the technique is always considered opaque +// - If set to 1 the technique is always considered transparent +// - If set to 2 the plugin will check if the parameter marked with the OPACITY semantic is less than 1.0 +// - If set to 3 the plugin will use the transparencyTest annotation to create a MEL procedure to perform the desired test. +// Maya will then render the object twice. Front faces follow by back faces. + +// For some objects you may need to switch the Transparency Algorithm to 'Depth Peeling' to avoid transparency issues. +// Models that require this usually have internal faces. + +//------------------------------------ +// Defines +//------------------------------------ +// how many mip map levels should Maya generate or load per texture. +// 0 means all possible levels +// some textures may override this value, but most textures will follow whatever we have defined here +// If you wish to optimize performance (at the cost of reduced quality), you can set NumberOfMipMaps below to 1 + +#define NumberOfMipMaps 0 +#define PI 3.1415926 +#define _3DSMAX_SPIN_MAX 99999 + +#ifndef _MAYA_ +#define _3DSMAX_ // at time of writing this shader, Nitrous driver did not have the _3DSMAX_ define set +#define _ZUP_ // Maya is Y up, 3dsMax is Z up +#endif + +#ifdef _MAYA_ +#define _SUPPORTTESSELLATION_ // at time of writing this shader, 3dsMax did not support tessellation +#endif + +//------------------------------------ +// State +//------------------------------------ +#ifdef _MAYA_ +RasterizerState WireframeCullFront { + CullMode = Front; + FillMode = WIREFRAME; +}; + +BlendState PMAlphaBlending { + AlphaToCoverageEnable = FALSE; + BlendEnable[0] = TRUE; + SrcBlend = ONE; + DestBlend = INV_SRC_ALPHA; + BlendOp = ADD; + SrcBlendAlpha = ONE; // Required for hardware frame render alpha channel + DestBlendAlpha = INV_SRC_ALPHA; + BlendOpAlpha = ADD; + RenderTargetWriteMask[0] = 0x0F; +}; +#endif + +//------------------------------------ +// Map Channels +//------------------------------------ +#ifdef _3DSMAX_ +int texcoord0 : Texcoord < + int Texcoord = 0; + int MapChannel = 1; + string UIWidget = "None"; +>; + +int texcoord1 : Texcoord < + int Texcoord = 1; + int MapChannel = 2; + string UIWidget = "None"; +>; + +int texcoord2 : Texcoord < + int Texcoord = 2; + int MapChannel = 3; + string UIWidget = "None"; +>; +#endif + +//------------------------------------ +// Samplers +//------------------------------------ +SamplerState CubeMapSampler { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; +}; + +SamplerState SamplerAnisoWrap { + Filter = ANISOTROPIC; + AddressU = Wrap; + AddressV = Wrap; +}; + +SamplerState SamplerAnisoClamp { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; +}; + +SamplerState SamplerShadowDepth { + Filter = MIN_MAG_MIP_POINT; + AddressU = Border; + AddressV = Border; + BorderColor = float4(1.0f, 1.0f, 1.0f, 1.0f); +}; + +//------------------------------------ +// Textures +//------------------------------------ + +Texture2D LutTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS LUT Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +Texture2D DitherTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Dither Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +// --------------------------------------------- +// Blend GROUP +// --------------------------------------------- + +bool UseBlendTexture < + string UIGroup = "Wrinkle mixing"; + string UIName = "Enable Wrinkle Mixing"; + int UIOrder = 919; +> = false; + + + + + + +Texture2D OcclusionTexture < + string UIGroup = "Occlusion"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Ambient Occlusion Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 401; + int UVEditorOrder = 2; +>; + +Texture2D ScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Radius Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 209; + int UVEditorOrder = 2; +>; + +Texture2D CavityTexture < + string UIGroup = "Cavity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 501; + int UVEditorOrder = 4; +>; + +Texture2D DiffuseTexture < + string UIGroup = "Diffuse"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 201; + int UVEditorOrder = 1; +>; + +Texture2D SpecularTexture < + string UIGroup = "Specular"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 302; + int UVEditorOrder = 4; +>; + +Texture2D NormalTexture < + string UIGroup = "Normal"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; // If mip maps exist in texture, Maya will load them. So user can pre-calculate and re-normalize mip maps for normal maps in .dds + int UIOrder = 601; + int UVEditorOrder = 5; +>; + +Texture2D MicroCavityTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 701; + int UVEditorOrder = 5; +>; + +Texture2D MicroNormalTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 704; + int UVEditorOrder = 5; +>; + +#ifdef _SUPPORTTESSELLATION_ +Texture2D DisplacementTexture < + string UIGroup = "Tessellation and Displacement"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Displacement Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 902; + int UVEditorOrder = 8; +>; +#endif + +Texture2D BackScatteringThicknessTexture < + string UIGroup = "BackScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Thickness Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 215; + int UVEditorOrder = 10; +>; + +Texture2D OpacityMaskTexture < + string UIGroup = "Opacity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Opacity Mask"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 800; + int UVEditorOrder = 12; +>; + +TextureCube DiffuseCubeIBL < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; // Use (or load) max number of mip map levels so we can use blurring + int UIOrder = 108; + int UVEditorOrder = 10; +>; + +TextureCube SpecularCubeIBL : environment < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; + int UIOrder = 111; + int UVEditorOrder = 6; +>; + +//------------------------------------ +// Shadow Maps +//------------------------------------ +Texture2D light0ShadowMap : SHADOWMAP < + string Object = "Light 0"; // UI Group for lights, auto-closed + string UIWidget = "None"; + int UIOrder = 5010; +>; + +Texture2D light1ShadowMap : SHADOWMAP < + string Object = "Light 1"; + string UIWidget = "None"; + int UIOrder = 5020; +>; + +Texture2D light2ShadowMap : SHADOWMAP < + string Object = "Light 2"; + string UIWidget = "None"; + int UIOrder = 5030; +>; + +//------------------------------------ +// Internal depth textures for Maya depth-peeling transparency +//------------------------------------ +#ifdef _MAYA_ + +Texture2D transpDepthTexture : transpdepthtexture < + string UIWidget = "None"; +>; + +Texture2D opaqueDepthTexture : opaquedepthtexture < + string UIWidget = "None"; +>; + +#endif + +//------------------------------------ +// Per Frame parameters +//------------------------------------ +cbuffer UpdatePerFrame : register(b0) { + float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; + float4x4 view : View < string UIWidget = "None"; >; + float4x4 prj : Projection < string UIWidget = "None"; >; + float4x4 viewPrj : ViewProjection < string UIWidget = "None"; >; + + // A shader may wish to do different actions when Maya is rendering the preview swatch (e.g. disable displacement) + // This value will be true if Maya is rendering the swatch + bool IsSwatchRender : MayaSwatchRender < string UIWidget = "None"; > = false; + float2 screenSize : ViewportPixelSize < string UIWidget = "None"; >; + + // If the user enables viewport gamma correction in Maya's global viewport rendering settings, the shader should not do gamma again + bool MayaFullScreenGamma : MayaGammaCorrection < string UIWidget = "None"; > = false; +} + + +//------------------------------------ +// Per Object parameters +//------------------------------------ +cbuffer UpdatePerObject : register(b1) { + float4x4 world : World < string UIWidget = "None"; >; + float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; +#ifndef _SUPPORTTESSELLATION_ + float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; +#endif + +// --------------------------------------------- +// Lighting Settings GROUP +// --------------------------------------------- +bool LinearSpaceLighting < + string UIGroup = "Lighting Settings"; + string UIName = "Linear Space Lighting"; + int UIOrder = 100; +> = true; + +bool UseShadows < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIName = "Shadows"; + int UIOrder = 101; +#endif +> = true; + +float shadowMultiplier < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UIMax = 1.000; + float UIStep = 0.001; + string UIName = "Shadow Strength"; + int UIOrder = 102; +#endif +> = { 1.0f }; + +// This offset allows you to fix any in-correct self shadowing caused by limited precision. +// This tends to get affected by scene scale and polygon count of the objects involved. +float shadowDepthBias : ShadowMapBias < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UISoftMax = 10.000; + float UIStep = 0.001; + string UIName = "Shadow Bias"; + int UIOrder = 103; +#endif +> = { 0.01f }; + +// flips back facing normals to improve lighting for things like sheets of hair or leaves +bool flipBackfaceNormals < + string UIGroup = "Lighting Settings"; + string UIName = "Double Sided Lighting"; + int UIOrder = 104; +> = true; + +// -- light props are inserted here via UIOrder 20 - 49 + +// --------------------------------------------- +// IBL Settings GROUP +// --------------------------------------------- + +float SkyRotation < + string UIGroup = "IBL Settings"; + string UIName = "Sky Rotation"; + float UISoftMin = 0; + float UISoftMax = 360; + float UIMin = 0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1; + int UIOrder = 105; + string UIWidget = "Slider"; +> = { 0.0f }; + +bool UseDiffuseIBLMap < + string UIGroup = "IBL Settings"; + string UIName = "Use Diffuse Cubemap"; + int UIOrder = 106; +> = false; + +float DiffuseIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Diffuse IBL Intensity"; + int UIOrder = 107; +> = 1.0; + +bool UseSpecCubeIBL < + string UIGroup = "IBL Settings"; + string UIName = "Use Specular Cubemap"; + int UIOrder = 109; +> = false; + +float SpecularIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Specular IBL Intensity"; + int UIOrder = 110; +> = 1.0; + +// --------------------------------------------- +// Diffuse GROUP +// --------------------------------------------- + +bool UseDiffuseTexture < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map"; + int UIOrder = 200; +> = false; + + +bool UseDiffuseTextureAlpha < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map Alpha"; + int UIOrder = 201; +> = false; + +float3 DiffuseColor : Diffuse < + string UIGroup = "Diffuse"; + string UIName = "Diffuse Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 202; +> = { 1.0f, 1.0f, 1.0f }; + +// --------------------------------------------- +// SSS GROUP +// --------------------------------------------- + +float skinCoeffX < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient R"; + int UIOrder = 204; +> = 1.0; + +float skinCoeffY < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient G"; + int UIOrder = 205; +> = 0.5; + +float skinCoeffZ < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient B"; + int UIOrder = 206; +> = 0.25; + +float NormalBlurring < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Softness"; + int UIOrder = 207; +> = 0.25; + +bool UseScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string UIName = "Use SSS Radius Map"; + int UIOrder = 209; +> = false; + +float skinScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Radius"; + int UIOrder = 210; +> = 0.25; + +float shadowBlur < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Blur"; + int UIOrder = 211; +> = 1.0; + +float shadowDither < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Dither"; + int UIOrder = 211; +> = 1.0; + +float shadowScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Scattering"; + int UIOrder = 212; +> = 1.0; + +float shadowSaturation < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 4.0; + float UIMax = 4; + float UIStep = 0.1; + string UIName = "SSS Shadow Saturation"; + int UIOrder = 213; +> = 1.0; + +// --------------------------------------------- +// BackScattering GROUP +// --------------------------------------------- + +bool UseTranslucency < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering"; + int UIOrder = 214; +> = false; + +bool UseThicknessTexture < + string UIGroup = "BackScattering"; + string UIName = "Use Thickness Map"; + int UIOrder = 216; +> = false; + +float skinScatteringRoughness < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Width"; + int UIOrder = 217; +> = 1.0; + +/*float3 skinScatteringInnerColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Inner Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 215; +> = {0.25f, 0.05f, 0.02f };*/ + +float3 skinScatteringOuterColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 218; +> = { 0.25f, 0.05f, 0.02f }; + +float skinScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Amount"; + int UIOrder = 219; +> = 1.0; + +float skinAmbientScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Ambient Amount"; + int UIOrder = 220; +> = 1.0; + +/* float skinScatteringPlane < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Far Plane"; + int UIOrder = 218; +> = 1.0;*/ + +// --------------------------------------------- +// Specular GROUP +// --------------------------------------------- + +bool UseSpecularTexture < + string UIGroup = "Specular"; + string UIName = "Use Specular Map"; + int UIOrder = 301; +> = false; + +bool UseSpecularTextureAlpha < + string UIGroup = "Specular"; + string UIName = "Use Roughness Map Alpha"; + int UIOrder = 301; +> = false; + +float3 SpecularColor : Specular < + string UIGroup = "Specular"; + string UIName = "Specular Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 303; +> = { 1.0f, 1.0f, 1.0f }; + + +float LobeMix < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Lobe Mixing"; + int UIOrder = 304; +> = 0.75; + +float Roughness < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Roughness multiplier"; + int UIOrder = 305; +> = .2; + +// --------------------------------------------- +// Occlusion GROUP +// --------------------------------------------- + +bool UseAmbientOcclusionTexture < + string UIGroup = "Occlusion"; + string UIName = "Use Occlusion Map"; + int UIOrder = 400; +> = false; + +float OcclusionAmount < + string UIGroup = "Occlusion"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Occlusion Amount"; + int UIOrder = 402; +> = 1.0; + +// --------------------------------------------- +// Cavity GROUP +// --------------------------------------------- + +bool UseCavityTexture < + string UIGroup = "Cavity"; + string UIName = "Use Cavity Map"; + int UIOrder = 500; +> = false; + +float CavityAmount < + string UIGroup = "Cavity"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Cavity Amount"; + int UIOrder = 502; +> = 1.0; + +// --------------------------------------------- +// Normal GROUP +// --------------------------------------------- +bool UseNormalTexture < + string UIGroup = "Normal"; + string UIName = "Use Normal Map"; + int UIOrder = 600; +> = false; + +float NormalHeight < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Normal Height"; + int UIOrder = 603; +> = 1.0; + +bool SupportNonUniformScale < + string UIGroup = "Normal"; + string UIName = "Support Non-Uniform Scale"; + int UIOrder = 604; +> = true; + +int NormalCoordsysX < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal X (Red)"; + int UIOrder = 605; +> = 0; + +int NormalCoordsysY < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal Y (Green)"; + int UIOrder = 606; +> = 0; + +// --------------------------------------------- +// Micro Details GROUP +// --------------------------------------------- + +bool UseMicroCavityTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Cavity Map"; + int UIOrder = 700; +> = false; + +float MicroCavityAmount < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Cavity Amount"; + int UIOrder = 702; +> = 1.0; + +bool UseMicroNormalTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Normal Map"; + int UIOrder = 703; +> = false; + +float MicroNormalHeight < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Normal Height"; + int UIOrder = 705; +> = 1.0; + +float MicroScale < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 16.0; + float UISoftMax = 256.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Scale"; + int UIOrder = 706; +> = 32; + +// --------------------------------------------- +// Opacity GROUP +// --------------------------------------------- +float Opacity : OPACITY < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity"; + int UIOrder = 801; +> = 1.0; + +bool UseOpacityMaskTexture < + string UIGroup = "Opacity"; + string UIName = "Opacity Mask"; + int UIOrder = 802; +> = false; + +// at what value do we clip away pixels +float OpacityMaskBias < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity Mask Bias"; + int UIOrder = 803; +> = 0.1; + +#ifdef _SUPPORTTESSELLATION_ +// --------------------------------------------- +// Tessellation and Displacement GROUP +// --------------------------------------------- +int DisplacementModel < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Model"; + string UIFieldNames = "Grayscale:Tangent Vector"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 900; +> = false; + +bool UseDisplacementMap < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Map"; + int UIOrder = 901; +> = false; + +int VectorDisplacementCoordSys < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + string UIFieldNames = "Mudbox (XZY):Maya (XYZ)"; + string UIName = "Displacement Coordsys"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 903; +> = 0; + +float DisplacementHeight < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 10.0; + string UIName = "Displacement Height"; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + int UIOrder = 904; +> = 0.5; + +// This allows you to control what the 'base' value for displacement is. +// When the offset value is 0.5, that means that a gray value (color: 128,128,128) will get 0 displacement. +// A value of 0 would then dent in. +// A value of 1 would then extrude. +float DisplacementOffset < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = -1.0; + float UISoftMax = 1.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + string UIName = "Displacement Offset"; + int UIOrder = 905; +> = 0.5; + +// This gives the artist control to prevent this shader from clipping away faces to quickly when displacement is actually keeping the faces on screen. +// This is also important for e.g. shadow map generation to make sure displaced vertices are not clipped out of the light's view +// See BBoxExtraScale for artist control over Maya clipping the entire object away when it thinks it leaves the view. +float DisplacementClippingBias < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 99.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Displacement Clipping Bias"; + int UIOrder = 906; +> = 5.0; + +// This gives the artist control to prevent maya from clipping away the entire object to fast in case displacement is used. +// Its semantic has to be BoundingBoxExtraScale +float BBoxExtraScale : BoundingBoxExtraScale < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Bounding Box Extra Scale"; + int UIOrder = 907; +> = 1.0; + +float TessellationRange < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 999.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1.0; + string UIName = "Tessellation Range"; + int UIOrder = 908; +> = { 0 }; + +float TessellationMin < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Tessellation Minimum"; + int UIOrder = 909; +> = 3.0; + +float FlatTessellation < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.1; + string UIName = "Flat Tessellation"; + int UIOrder = 910; +> = 0.0; +#endif + +// --------------------------------------------- +// UV assignment GROUP +// --------------------------------------------- +// Use the Surface Data Section to set your UVset names for each Texcoord. +// E.g. TexCoord1 = uv:UVset +// Then pick a Texcoord in the UV Section to use that UVset for a texture. + +int DiffuseTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Diffuse Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2002; +> = 0; + +int OcclusionTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Ambient Occlusion Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2003; +> = 1; + +int OpacityMaskTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Opacity Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2005; +> = 0; + +int SpecularTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Specular Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2006; +> = 0; + +int NormalTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Normal Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2008; +> = 0; + +#ifdef _SUPPORTTESSELLATION_ +int DisplacementTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Displacement Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2010; +> = 0; +#endif + +int ThicknessTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Translucency Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2011; +> = 0; +} //end UpdatePerObject cbuffer + +//------------------------------------ +// Light parameters +//------------------------------------ +cbuffer UpdateLights : register(b2) { +// --------------------------------------------- +// Light 0 GROUP +// --------------------------------------------- +// This value is controlled by Maya to tell us if a light should be calculated +// For example the artist may disable a light in the scene, or choose to see only the selected light +// This flag allows Maya to tell our shader not to contribute this light into the lighting +bool light0Enable : LIGHTENABLE < +string Object = "Light 0"; // UI Group for lights, auto-closed +string UIName = "Enable Light 0"; +int UIOrder = 20; +#ifdef _MAYA_ +> = false; // maya manages lights itself and defaults to no lights +#else +> = true; // in 3dsMax we should have the default light enabled +#endif + +// follows LightParameterInfo::ELightType +// spot = 2, point = 3, directional = 4, ambient = 5, +int light0Type : LIGHTTYPE < + string Object = "Light 0"; + string UIName = "Light 0 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + int UIOrder = 21; + float UIMin = 0; + float UIMax = 5; + float UIStep = 1; +> = 2; // default to spot so the cone angle etc work when "Use Shader Settings" option is used + +float3 light0Pos : POSITION < + string Object = "Light 0"; + string UIName = "Light 0 Position"; + string Space = "World"; + int UIOrder = 22; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +float3 light0Color : LIGHTCOLOR < + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Color"; + string UIWidget = "Color"; + int UIOrder = 23; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light0Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 24; +#endif +> = { 1.0f }; + +float3 light0Dir : DIRECTION < + string Object = "Light 0"; + string UIName = "Light 0 Direction"; + string Space = "World"; + int UIOrder = 25; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light0ConeAngle : HOTSPOT // In radians +#else +float light0ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 26; +#endif +> = { 0.46f }; + +#ifdef _MAYA_ +float light0FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light0FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 27; +#endif +> = { 0.7f }; + +float light0AttenScale : DECAYRATE < + string Object = "Light 0"; + string UIName = "Light 0 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 28; +> = { 0.0 }; + +bool light0ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 29; +#endif +> = true; + +float4x4 light0Matrix : SHADOWMAPMATRIX < + string Object = "Light 0"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 1 GROUP +// --------------------------------------------- +bool light1Enable : LIGHTENABLE < + string Object = "Light 1"; + string UIName = "Enable Light 1"; + int UIOrder = 30; +> = false; + +int light1Type : LIGHTTYPE < + string Object = "Light 1"; + string UIName = "Light 1 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 31; +> = 2; + +float3 light1Pos : POSITION < + string Object = "Light 1"; + string UIName = "Light 1 Position"; + string Space = "World"; + int UIOrder = 32; + int RefID = 1; // 3DSMAX +> = { -100.0f, 100.0f, 100.0f }; + +float3 light1Color : LIGHTCOLOR < + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Color"; + string UIWidget = "Color"; + int UIOrder = 33; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light1Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 34; +#endif +> = { 1.0f }; + +float3 light1Dir : DIRECTION < + string Object = "Light 1"; + string UIName = "Light 1 Direction"; + string Space = "World"; + int UIOrder = 35; + int RefID = 1; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light1ConeAngle : HOTSPOT // In radians +#else +float light1ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 36; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light1FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light1FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 37; +#endif +> = { 0.0f }; + +float light1AttenScale : DECAYRATE < + string Object = "Light 1"; + string UIName = "Light 1 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 38; +> = { 0.0 }; + +bool light1ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 39; +#endif +> = true; + +float4x4 light1Matrix : SHADOWMAPMATRIX < + string Object = "Light 1"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 2 GROUP +// --------------------------------------------- +bool light2Enable : LIGHTENABLE < + string Object = "Light 2"; + string UIName = "Enable Light 2"; + int UIOrder = 40; +> = false; + +int light2Type : LIGHTTYPE < + string Object = "Light 2"; + string UIName = "Light 2 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 41; +> = 2; + +float3 light2Pos : POSITION < + string Object = "Light 2"; + string UIName = "Light 2 Position"; + string Space = "World"; + int UIOrder = 42; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, -100.0f }; + +float3 light2Color : LIGHTCOLOR < + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Color"; + string UIWidget = "Color"; + int UIOrder = 43; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light2Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 44; +#endif +> = { 1.0f }; + +float3 light2Dir : DIRECTION < + string Object = "Light 2"; + string UIName = "Light 2 Direction"; + string Space = "World"; + int UIOrder = 45; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light2ConeAngle : HOTSPOT // In radians +#else +float light2ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 46; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light2FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light2FallOff : LIGHTFALLOFF +#endif +< +string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 47; +#endif +> = { 0.0f }; + +float light2AttenScale : DECAYRATE < + string Object = "Light 2"; + string UIName = "Light 2 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 48; +> = { 0.0 }; + +bool light2ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 49; +#endif +> = true; + +float4x4 light2Matrix : SHADOWMAPMATRIX < + string Object = "Light 2"; + string UIWidget = "None"; +>; + +} //end lights cbuffer + +//------------------------------------ +// Structs +//------------------------------------ +struct APPDATA { + float3 position : POSITION; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 normal : NORMAL; + float3 binormal : BINORMAL; + float3 tangent : TANGENT; +}; + +struct SHADERDATA { + float4 position : SV_Position; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 worldNormal : NORMAL; + float4 worldTangent : TANGENT; + float3 worldPosition : TEXCOORD3; + float4 screenCoord : TEXCOORD14; + +#ifdef _SUPPORTTESSELLATION_ + // Geometry generated control points: + // .worldPosition is CP0, so we don't need to store it again + float3 CP1 : TEXCOORD4; + float3 CP2 : TEXCOORD5; + + // PN-AEN with displacement fix: + float4 dominantEdge : TEXCOORD6; // both vertices of an edge + float2 dominantVertex : TEXCOORD7; // corner + + // Dominant normal and tangent for VDM crack fix: + // this could be compacted into less texcoords, but left as-is for readability + float3 dominantNormalE0 : TEXCOORD8; + float3 dominantNormalE1 : TEXCOORD9; + float3 dominantNormalCorner : TEXCOORD10; + + float3 dominantTangentE0 : TEXCOORD11; + float3 dominantTangentE1 : TEXCOORD12; + float3 dominantTangentCorner : TEXCOORD13; + + float clipped : CLIPPED; +#endif +}; + + +#ifdef _SUPPORTTESSELLATION_ +struct HSCONSTANTDATA { + float TessFactor[3] : SV_TessFactor; // tessellation amount for each edge of patch + float InsideTessFactor : SV_InsideTessFactor; // tessellation amount within a patch surface (would be float2 for quads) + float3 CPCenter : CENTER; // Geometry generated center control point +}; +#endif + +//------------------------------------ +// BRDF +//------------------------------------ + +float sqr(float x) { + return x*x; +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float D_Beckmann(float Roughness, float NoH) { + float m = Roughness; + float m2 = m * m; + + float NdotH2 = sqr(NoH); + return exp((NdotH2 - 1) / (m2 * NdotH2)) / (PI * m2 * NdotH2 * NdotH2); +} + +// This function is from Nvidia's Human Head demo +float D_BeckmannNVIDIA(float m, float ndoth) { + float alpha = acos(ndoth); + float ta = tan(alpha); + float val = 1.0 / (m*m*pow(ndoth, 4.0)) * exp(-(ta*ta) / (m*m)); + return val; +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_Schlick(float3 SpecularColor, float LdotH) { + return SpecularColor + (1.0f - SpecularColor) * exp2((-5.55473 * LdotH - 6.98316) * LdotH); +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2011, "Adopting a physically based shading model" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_LagardeSchlick(float3 SpecularColor, float Roughness, float NdotV) { + return SpecularColor + (max(1 - Roughness, SpecularColor) - SpecularColor) * exp2((-5.55473 * NdotV - 6.98316) * NdotV); +} + +float3 F_KelemenSzirmaykalos(float3 H, float3 V, float3 F0) { + float base = 1.0 - dot(V, H); + float exponential = pow(base, 5.0); + return exponential + F0 * (1.0 - exponential); +} + +float3 KelemenSzirmaykalos(float3 N, float3 L, float3 V, float roughness, float3 specular) { + float3 result = float3(0.0, 0.0, 0.0); + float NdotL = dot(N, L); + + if (NdotL > 0.0) { + float3 h = L + V; + float3 H = normalize(h); + float NdotH = dot(N, H); + float VdotH = dot(V, H); + float D = D_BeckmannNVIDIA(roughness, NdotH); + float3 F = F_Schlick(specular, VdotH); + float G = 1; + float3 specularDirect = max(D * G * F / dot(h, h), 0); + result = specularDirect * NdotL; // Specular is added for more tuning + } + return result; +} + +float3 PennerSkin(float3 skinCoef, float3 N, float3 L, float3 Nlow, float Curvature) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + pennerNdotL = saturate(pennerNdotL * 0.5 + 0.5); + + float3 pennerlookUp; + pennerlookUp.r = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.r, Curvature)).r; + pennerlookUp.g = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.g, Curvature)).g; + pennerlookUp.b = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.b, Curvature)).b; + + return pennerlookUp; +} + +float3 PennerSkinNoLUT(float3 skinCoef, float3 N, float3 L, float3 Nlow) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + + float3 pennerlookUp; + pennerlookUp.r = saturate(pennerNdotL.r*(float3(1, 1, 1).r - skinCoef.r) + skinCoef.r) * (1 - skinCoef.r); + pennerlookUp.g = saturate(pennerNdotL.g*(float3(1, 1, 1).g - skinCoef.g) + skinCoef.g) * (1 - skinCoef.g); + pennerlookUp.b = saturate(pennerNdotL.b*(float3(1, 1, 1).b - skinCoef.b) + skinCoef.b) * (1 - skinCoef.b); + + return pennerlookUp; +} + +float3 diffuseSkinIBL(float3 skinCoef, float3 diffuseIBL_HighFreq, float3 diffuseIBL_LowFreq) { + return lerp(diffuseIBL_HighFreq, diffuseIBL_LowFreq, skinCoef); +} + +//------------------------------------ +// Functions +//------------------------------------ + +float4 ComputeScreenPos(float4 pos) { +#if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; +#else + float scale = 1.0; +#endif + + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*scale) + o.w; + o.zw = pos.zw; + + return o; +} + +// Occlusion taking into account the color of the texture multiplied to it +float3 coloredOcclusion(float3 color, float occlusion) { + float3 coloredOcclusion = lerp(float3(1.0f, 1.0f, 1.0f), color, (1 - occlusion)); + //color *= coloredOcclusion; + return coloredOcclusion; +} + +float specularOcclusion(float3 N, float3 V, float Occlusion) { + const float specularPow = 5.0; + float NdotV = dot(N, V); + float s = saturate(-0.3 + NdotV * NdotV); + + return lerp(pow(Occlusion, specularPow), 1.0, s); +} + +float2 pickTexcoord(int index, float2 t0, float2 t1, float2 t2) { + float2 tcoord = t0; + + if (index == 1) { + tcoord = t1; + } else if (index == 2) { + tcoord = t2; + } + + return tcoord; +} + +float3 RotateVectorYaw(float3 vec, float degreeOfRotation) { + float3 rotatedVec = vec; + float angle = radians(degreeOfRotation); + + rotatedVec.x = (cos(angle) * vec.x) - (sin(angle) * vec.z); + rotatedVec.z = (sin(angle) * vec.x) + (cos(angle) * vec.z); + + return rotatedVec; +} + +// Spot light cone +float lightConeangle(float coneAngle, float coneFalloff, float3 lightVec, float3 lightDir) { + // the cone falloff should be equal or bigger then the coneAngle or the light inverts + // this is added to make manually tweaking the spot settings easier. + if (coneFalloff < coneAngle) { + coneFalloff = coneAngle; + } + + float LdotDir = dot(normalize(lightVec), lightDir); + + // cheaper cone, no fall-off control would be: + // float cone = pow(saturate(LdotDir), 1 / coneAngle); + + // higher quality cone (more expensive): + float cone = smoothstep(cos(coneFalloff), cos(coneAngle), LdotDir); + + return cone; +} + +#define SHADOW_FILTER_TAPS_CNT 10 + +float2 SuperFilterTaps[SHADOW_FILTER_TAPS_CNT] < string UIWidget = "None"; > = { + { -0.84052f, -0.073954f }, + { -0.326235f, -0.40583f }, + { -0.698464f, 0.457259f }, + { -0.203356f, 0.6205847f }, + { 0.96345f, -0.194353f }, + { 0.473434f, -0.480026f }, + { 0.519454f, 0.767034f }, + { 0.185461f, -0.8945231f }, + { 0.507351f, 0.064963f }, + { -0.321932f, 0.5954349f } +}; + +static float4 kernel[25] = { + { 0.530605, 0.613514, 0.739601, 0 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, -3 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, -2.52083 }, + { 0.00500364, 0.00020094, 5.28848e-005, -2.08333 }, + { 0.00700976, 0.00049366, 0.000151938, -1.6875 }, + { 0.0094389, 0.00139119, 0.000416598, -1.33333 }, + { 0.0128496, 0.00356329, 0.00132016, -1.02083 }, + { 0.017924, 0.00711691, 0.00347194, -0.75 }, + { 0.0263642, 0.0119715, 0.00684598, -0.520833 }, + { 0.0410172, 0.0199899, 0.0118481, -0.333333 }, + { 0.0493588, 0.0367726, 0.0219485, -0.1875 }, + { 0.0402784, 0.0657244, 0.04631, -0.0833333 }, + { 0.0211412, 0.0459286, 0.0378196, -0.0208333 }, + { 0.0211412, 0.0459286, 0.0378196, 0.0208333 }, + { 0.0402784, 0.0657244, 0.04631, 0.0833333 }, + { 0.0493588, 0.0367726, 0.0219485, 0.1875 }, + { 0.0410172, 0.0199899, 0.0118481, 0.333333 }, + { 0.0263642, 0.0119715, 0.00684598, 0.520833 }, + { 0.017924, 0.00711691, 0.00347194, 0.75 }, + { 0.0128496, 0.00356329, 0.00132016, 1.02083 }, + { 0.0094389, 0.00139119, 0.000416598, 1.33333 }, + { 0.00700976, 0.00049366, 0.000151938, 1.6875 }, + { 0.00500364, 0.00020094, 5.28848e-005, 2.08333 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, 2.52083 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, 3 } +}; + + +static float2 kernelRandom[32] = { + { 0.254395, 0.385445 }, + { -0.139177, 0.571074 }, + { -0.453510, 0.962140 }, + { 0.482684, 0.346190 }, + { 0.889741, 0.724799 }, + { -0.661047, -0.137344 }, + { -0.193311, -0.313475 }, + { 0.363177, -0.960291 }, + { -0.225866, -0.654962 }, + { 0.407875, 0.431522 }, + { -0.543008, -0.992827 }, + { -0.878493, -0.896999 }, + { -0.641776, 0.130757 }, + { -0.785279, -0.015190 }, + { 0.469054, 0.248633 }, + { -0.820410, -0.562833 }, + { 0.174019, -0.618069 }, + { -0.906449, -0.275099 }, + { -0.655285, -0.956021 }, + { 0.453776, -0.085425 }, + { -0.430788, -0.089530 }, + { -0.587370, -0.851826 }, + { 0.149056, -0.474322 }, + { 0.228684, 0.321661 }, + { -0.668752, -0.829400 }, + { -0.729554, 0.438250 }, + { -0.467018, -0.252882 }, + { 0.090398, 0.618760 }, + { 0.741840, 0.516401 }, + { -0.983891, 0.248701 }, + { -0.162010, -0.714455 }, + { 0.308825, 0.787175 } +}; + +float shadowMapTexelSize < string UIWidget = "None"; > = { 0.00195313 }; // (1.0f / 512) + +// Shadows: +// Percentage-Closer Filtering +float3 lightShadow(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size) { + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float shadowColored = 0; + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + float z = Pndc.z - shadowDepthBias / Pndc.w; + + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 32; ++i) { + float2 offset = kernelRandom[i] * shadowDepth * shadowMapTexelSize; + float2 ditherOffset = mul(offset, rotationMatrix); + ditherOffset = lerp(offset, ditherOffset, shadowDither); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + ditherOffset, 0).x; + + ditherShadow += (sample >= 0.0f) ? 0.0f : (1.0f / 32); + } + } + + return ditherShadow; +} + +float3 lightShadowSkin(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size, float2 dir) { + + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float3 shadowColored = float3(0, 0, 0); + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + + float z = Pndc.z - shadowDepthBias / Pndc.w; + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 25; ++i) { + float2 offset = kernel[i].a * dir * shadowDepth * shadowMapTexelSize; + offset = mul(offset, rotationMatrix); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + offset, 0).x; + ditherShadow = (sample >= 0.0f) ? 0.0f : 1.0f; + + shadowColored += ditherShadow * kernel[i].rgb; + } + } + + return shadowColored; +} + +#ifdef _SUPPORTTESSELLATION_ +// Pick dominant for crack free displacement (original function by Bryan Dudash, modified to support any float3) +float3 PickDominant(float3 vec, // vector to change + float U, float V, float W, // barycoords + float3 DE0A, float3 DE0B, // domimant edge 0 vertex A and B + float3 DE1A, float3 DE1B, // domimant edge 1 vertex A and B + float3 DE2A, float3 DE2B, // domimant edge 2 vertex A and B + float3 DV0, float3 DV1, float3 DV2) { // dominant corners + // Override the texture coordinates along the primitive edges and at the corners. + // Keep the original interpolated coords for the inner area of the primitive. + + float3 dominantVector = vec; + + float edgeThreshold = 0.0001f; + float edgeU = (U == 0) ? 1 : 0; + float edgeV = (V == 0) ? 1 : 0; + float edgeW = (W == 0) ? 1 : 0; + + float corner = ((edgeU + edgeV + edgeW) == 2) ? 1 : 0; // two are 0, means we are a corner + float edge = ((edgeU + edgeV + edgeW) == 1) ? 1 : 0; // one of them is 0, means we are an edge + float innerarea = ((edgeU + edgeV + edgeW) == 0) ? 1 : 0; // none are 0, means we are interior + + if (innerarea != 1) { + // Note: the order of the vertices/edges we choose here can be different per application + // and depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + if (corner) { + if (U > 1.0 - edgeThreshold) + dominantVector = DV1; + else if (V > 1.0 - edgeThreshold) + dominantVector = DV2; + else if (W > 1.0 - edgeThreshold) + dominantVector = DV0; + } else { + if (edgeU) + dominantVector = lerp(DE2A, DE2B, W); + else if (edgeV) + dominantVector = lerp(DE0A, DE0B, U); + else + dominantVector = lerp(DE1A, DE1B, V); + } + } + + return dominantVector; +} + +// outside of view? +float IsClipped(float4 clipPos) { + float W = clipPos.w + DisplacementClippingBias; // bias allows artist to control to early clipping due to displacement + // Test whether the position is entirely inside the view frustum. + return (-W <= clipPos.x && clipPos.x <= W && -W <= clipPos.y && clipPos.y <= W && -W <= clipPos.z && clipPos.z <= W) ? 0.0f : 1.0f; +} + +// Compute whether all three control points along the edge are outside of the view frustum. +// By doing this, we're ensuring that +// 1.0 means clipped, 0.0 means unclipped. +float ComputeClipping(float3 cpA, float3 cpB, float3 cpC) { + // Compute the projected position for each position, then check to see whether they are clipped. + float4 projPosA = mul(float4(cpA, 1), viewPrj), projPosB = mul(float4(cpB, 1), viewPrj), projPosC = mul(float4(cpC, 1), viewPrj); + return min(min(IsClipped(projPosA), IsClipped(projPosB)), IsClipped(projPosC)); +} + +// PN Triangles and PN-AEN control points: +float3 ComputeCP(float3 posA, float3 posB, float3 normA) { + return (2.0f * posA + posB - (dot((posB - posA), normA) * normA)) / 3.0f; +} +#endif + +// Clip pixel away when opacity mask is used +void OpacityMaskClip(float2 uv) { + if (UseOpacityMaskTexture) { + float OpacityMaskMap = OpacityMaskTexture.Sample(SamplerAnisoWrap, uv).x; + + // clip value when less then 0 for punch-through alpha. + clip(OpacityMaskMap < OpacityMaskBias ? -1 : 1); + } +} + + +// Calculate a light: +struct lightOut { + float Specular; + float3 Color; +}; + +lightOut CalculateLight(bool lightEnable, int lightType, float lightAtten, float3 lightPos, float3 vertWorldPos, + float3 lightColor, float lightIntensity, float3 lightDir, float lightConeAngle, float lightFallOff, float4x4 lightViewPrjMatrix, + uniform Texture2D lightShadowMap, bool lightShadowOn, float3 vertexNormal, float3 normal, float3 diffuseColorIn, + float3 eyeVec, float roughness, float3 specularColorIn, float3 thickness, float softenMask, + float gammaCorrection, float opacity, float3 ambientOcclusion, float3 skinOcclusion, float2 screenCoord, float2 size, float scatteringRadius) { + lightOut OUT = (lightOut)0; + + OUT.Specular = 0.0; + OUT.Color = float3(0, 0, 0); + + if (lightEnable) { + // For Maya, flip the lightDir: +#ifdef _MAYA_ + lightDir = -lightDir; +#endif + + bool isAmbientLight = (lightType == 5); + if (isAmbientLight) { + OUT.Color = diffuseColorIn * lightColor * lightIntensity; + OUT.Color.rgb *= ambientOcclusion; + return OUT; + } + + bool isDirectionalLight = (lightType == 4); + float3 lightVec = lerp(lightPos - vertWorldPos, lightDir, isDirectionalLight); + + float3 L = normalize(lightVec); + + // Diffuse: + float3 diffuseDirect = float3(0, 0, 0); + float3 scatter = float3(skinCoeffX, skinCoeffY, skinCoeffZ); + diffuseDirect = PennerSkin(scatter, normal, L, vertexNormal, 1 - (scatteringRadius*skinScattering)) * diffuseColorIn; + //diffuseDirect = PennerSkinNoLUT(scatter,normal,L, vertexNormal) * diffuseColorIn; + + // Specular: + float3 specularDirect = float3(0, 0, 0); + + float3 Lobe1 = KelemenSzirmaykalos(normal, L, eyeVec, roughness, specularColorIn); + float3 Lobe2 = KelemenSzirmaykalos(normal, L, eyeVec, roughness*0.5, specularColorIn); + + specularDirect = Lobe2 * LobeMix + Lobe1 * (1 - LobeMix); + + // Light Attenuation: + bool enableAttenuation = lightAtten > 0.0001f; + float attenuation = 1.0f; + if (!isDirectionalLight) { + attenuation = lerp(1.0, 1 / pow(length(lightVec), lightAtten), enableAttenuation); + } + + // Spot light Cone Angle: + float angle = 1; + if (lightType == 2) { + angle = lightConeangle(lightConeAngle, lightFallOff, lightVec, lightDir); + } + + // Shadows: + float shadow = 1; + float3 skinShadow = float3(1, 1, 1); + float3 softShadow = float3(1, 1, 1); + if (UseShadows && lightShadowOn) { + shadow = lightShadow(lightViewPrjMatrix, lightShadowMap, vertWorldPos, screenCoord, shadowBlur, size); + + skinShadow = LutTexture.Sample(SamplerAnisoClamp, float2(shadow * angle, 1 - shadowScattering)); + skinShadow = lerp(dot(float3(0.33, 0.59, 0.11), skinShadow), skinShadow, shadowSaturation); + skinShadow = lerp(skinShadow, 1, (shadow* angle)*(shadow* angle)*(shadow* angle)); + } + + float3 lightAttenuation = lightIntensity * angle * attenuation * lightColor; + + diffuseDirect *= lightIntensity * skinShadow * attenuation * lightColor; + specularDirect *= lightAttenuation * shadow; + + float3 backScattering = float3(0, 0, 0); + if (UseTranslucency) { + half backRoughness = (1 - skinScatteringRoughness) * 128; + float3 viewScattering = exp2(saturate(dot(eyeVec, -(L + (normal * 0.01)))) * backRoughness - backRoughness) * skinScatteringAmount; + float3 lightScattering = saturate(dot(-L, normal)*0.5 + 0.5) * skinAmbientScatteringAmount; + + //float3 IBLScattering = diffuseIBL; + backScattering = (viewScattering + lightScattering) * lightAttenuation * shadow * thickness; + + float3 profile = skinScatteringOuterColor * backScattering; + backScattering = profile * skinScatteringAmount; + + + /*float scale = 2e4 * (1.0 - skinScatteringAmount) / backRoughness; + + float4 shrinkedPos = float4(vertWorldPos - 0.005 * vertexNormal, 1.0); + + float4 shadowPosition = mul(shrinkedPos, lightViewPrjMatrix); + + float d1 = lightShadowMap.Sample(SamplerShadowDepth, shadowPosition.xy / shadowPosition.w); // 'd1' has a range of 0..1 + + float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane' + d1 *= skinScatteringPlane*shadowPosition.w; // So we scale 'd1' accordingly: + float d = scale * abs(d1 - d2); + + float dd = -d * d; + float3 profile = float3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + float3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + float3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + float3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + float3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + float3(0.078, 0.0, 0.0) * exp(dd / 7.41); + backScattering = profile * saturate((0.3 + dot(L, -vertexNormal)) / 1.3) * thickness * diffuseColorIn; */ + } + + OUT.Color += diffuseDirect * skinOcclusion; + OUT.Color *= opacity; + OUT.Color += specularDirect * ambientOcclusion + backScattering; + + // Output specular and rim for opacity: + // OUT.Specular = dot(saturate(specularColor), float3(0.3f, 0.6f, 0.1f)); + } // end if light enabled + + return OUT; +} + +//------------------------------------ +// vertex shader with tessellation +//------------------------------------ +// take inputs from 3d-app +// vertex animation/skinning would happen here +SHADERDATA vt(APPDATA IN) { + SHADERDATA OUT = (SHADERDATA)0; + + // we pass vertices in world space + float4 worldPos = mul(float4(IN.position, 1), world); + OUT.worldPosition.xyz = worldPos.xyz; + +#ifdef _SUPPORTTESSELLATION_ + OUT.position = worldPos; +#else + OUT.position = float4(IN.position.xyz, 1); +#endif + + OUT.screenCoord = mul(float4(OUT.position.xyz, 1), viewPrj); + + // Pass through texture coordinates + // flip Y for Maya +#ifdef _MAYA_ + OUT.texCoord0 = float2(IN.texCoord0.x, (1.0 - IN.texCoord0.y)); + OUT.texCoord1 = float2(IN.texCoord1.x, (1.0 - IN.texCoord1.y)); + OUT.texCoord2 = float2(IN.texCoord2.x, (1.0 - IN.texCoord2.y)); +#else + OUT.texCoord0 = IN.texCoord0; + OUT.texCoord1 = IN.texCoord1; + OUT.texCoord2 = IN.texCoord2; +#endif + + // output normals in world space: + if (!SupportNonUniformScale) { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)world)); + } else { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)worldIT)); + } + + // output tangent in world space: + if (!SupportNonUniformScale) { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)world)); + } else { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)worldIT)); + } + + // store direction for normal map: + OUT.worldTangent.w = 1; + if (dot(cross(IN.normal.xyz, IN.tangent.xyz), IN.binormal.xyz) < 0.0) { + OUT.worldTangent.w = -1; + } + + return OUT; +} + + +//------------------------------------ +// vertex shader without tessellation +//------------------------------------ +SHADERDATA v(APPDATA IN) { + SHADERDATA OUT = vt(IN); + + // If we don't use tessellation, pass vertices in clip space: +#ifdef _SUPPORTTESSELLATION_ + OUT.position = mul(float4(OUT.position.xyz, 1), viewPrj); +#else + OUT.position = mul(float4(IN.position, 1), wvp); +#endif + + return OUT; +} + +#ifdef _SUPPORTTESSELLATION_ +//------------------------------------ +// hull shader +//------------------------------------ +// executed once per control point. +// control points can be considered the original vertices of the mesh +// outputs a control point +// run parallel with hull constant function +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_cw")] +[patchconstantfunc("HS_Constant")] +[outputcontrolpoints(3)] +[maxtessfactor(64.0)] + +// PN-AEN without displacement fix: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + +// PN Triangles, no crack fixes: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + + +// PN-AEN and displacement fix +// the index buffer is made up as follows: +// the triangle vertices index (int3) // PNAEN9 and PNAEN18 +// the 3 adjacent edges vertices index (3 * int2) // PNAEN9 and PNAEN18 +// the 3 dominant edges vertices index (3 * int2) // PNAEN18 +// the dominant position vertices index (int3) // PNAEN18 +SHADERDATA HS(InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID) { + SHADERDATA OUT = (SHADERDATA)0; + + // copy everything first: + OUT = IN[index]; + + // Compute the next output control point ID so we know which edge we're on. + const uint nextIndex = index < 2 ? index + 1 : 0; // (index + 1) % 3 + + // PN-AEN 9 and 18: + const uint neighborIndex = 3 + 2 * index; + const uint neighborNextIndex = neighborIndex + 1; + float3 myCP, neighborCP; + + // Calculate original PN control points and neighbors'. Then average. + myCP = ComputeCP(IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + neighborCP = ComputeCP(IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldNormal); + OUT.CP1 = (myCP + neighborCP) / 2; + + myCP = ComputeCP(IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + neighborCP = ComputeCP(IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldNormal); + OUT.CP2 = (myCP + neighborCP) / 2; + + // PN Triangles only would be: + // OUT.CP1 = ComputeCP( IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + // OUT.CP2 = ComputeCP( IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + + // Clipping: + OUT.clipped = ComputeClipping(OUT.worldPosition, OUT.CP1, OUT.CP2); + + // PN-AEN discontinuity code for displacement UVs: + const uint dominantEdgeIndex = 9 + 2 * index; + const uint dominantEdgeNextIndex = dominantEdgeIndex + 1; + const uint dominantVertexIndex = 15 + index; + + // Note: the order of the vertices/edges we choose here can be different per application and + // depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + float2 dominantEdgeUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeIndex].texCoord0, IN[dominantEdgeIndex].texCoord1, IN[dominantEdgeIndex].texCoord2); + float2 dominantEdgeNextUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeNextIndex].texCoord0, IN[dominantEdgeNextIndex].texCoord1, IN[dominantEdgeNextIndex].texCoord2); + float2 dominantVertexUV = pickTexcoord(DisplacementTexcoord, IN[dominantVertexIndex].texCoord0, IN[dominantVertexIndex].texCoord1, IN[dominantVertexIndex].texCoord2); + + OUT.dominantEdge = float4(dominantEdgeNextUV, dominantEdgeUV); + OUT.dominantVertex = dominantVertexUV; + + // VDM dominant normal and tangent for displacement crack fix: + OUT.dominantNormalE0 = IN[dominantEdgeNextIndex].worldNormal.xyz; + OUT.dominantNormalE1 = IN[dominantEdgeIndex].worldNormal.xyz; + OUT.dominantNormalCorner = IN[dominantVertexIndex].worldNormal.xyz; + + OUT.dominantTangentE0 = IN[dominantEdgeNextIndex].worldTangent.xyz; + OUT.dominantTangentE1 = IN[dominantEdgeIndex].worldTangent.xyz; + OUT.dominantTangentCorner = IN[dominantVertexIndex].worldTangent.xyz; + + return OUT; +} + +//------------------------------------ +// Hull shader constant function +//------------------------------------ +// executed once per patch +// outputs user defined data per patch and tessellation factor +// calculates control points for vertex and normal and passes to domain +// This hull shader passes the tessellation factors through to the HW tessellator, +// run parallel with hull function +HSCONSTANTDATA HS_Constant(const OutputPatch IN, uint patchID : SV_PrimitiveID) { + HSCONSTANTDATA OUT = (HSCONSTANTDATA)0; + + // future todo: + // triangle is on silhouette? + // triangle is facing camera? If facing backwards, reduce tessellation + // triangle lies in high frequency area of displacement map (density-based tessellation)? + + // Now setup the PNTriangle control points... + // Center control point + float3 f3E = (IN[0].CP1 + IN[0].CP2 + IN[1].CP1 + IN[1].CP2 + IN[2].CP1 + IN[2].CP2) / 6.0f; + float3 f3V = (IN[0].worldPosition + IN[1].worldPosition + IN[2].worldPosition) / 3.0f; + OUT.CPCenter = f3E + ((f3E - f3V) / 2.0f); + + // Clipping: + float4 centerViewPos = mul(float4(OUT.CPCenter, 1), viewPrj); + bool centerClipped = IsClipped(centerViewPos); + + if (IN[0].clipped && IN[1].clipped && IN[2].clipped && centerClipped) { + // If all control points are clipped, the surface cannot possibly be visible. + // Not entirely true, because displacement mapping can make them visible in the domain shader + // so we provide the user with a bias factor to avoid clipping too early + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = 0; + } else { + // Camera based tessellation, per object. So very basic. + float3 CameraPosition = viewInv[3].xyz; + float LengthOp = length((CameraPosition - world[3].xyz)); + float DivOp = (TessellationRange / LengthOp); + float MaxOp = max(TessellationMin + DivOp, 1); + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = MaxOp; + } + + // Inside tess factor is just the average of the edge factors + OUT.InsideTessFactor = (OUT.TessFactor[0] + OUT.TessFactor[1] + OUT.TessFactor[2]) / 3.0f; + + return OUT; +} + +//------------------------------------ +// domain shader +//------------------------------------ +// outputs the new vertices based on previous tessellation. +// also calculates new normals and uvs +// This domain shader applies contol point weighting to the barycentric coords produced by the FF tessellator +// If you wanted to do any vertex lighting, it would have to happen here. +[domain("tri")] +SHADERDATA DS(HSCONSTANTDATA HSIN, OutputPatch IN, float3 f3BarycentricCoords : SV_DomainLocation) { + SHADERDATA OUT = (SHADERDATA)0; + + // The barycentric coordinates + float fU = f3BarycentricCoords.x; + float fV = f3BarycentricCoords.y; + float fW = f3BarycentricCoords.z; + + // Precompute squares and squares * 3 + float fUU = fU * fU; + float fVV = fV * fV; + float fWW = fW * fW; + float fUU3 = fUU * 3.0f; + float fVV3 = fVV * 3.0f; + float fWW3 = fWW * 3.0f; + + // PN position: + float3 position = IN[0].worldPosition * fWW * fW + + IN[1].worldPosition * fUU * fU + + IN[2].worldPosition * fVV * fV + + IN[0].CP1 * fWW3 * fU + + IN[0].CP2 * fW * fUU3 + + IN[2].CP2 * fWW3 * fV + + IN[1].CP1 * fUU3 * fV + + IN[2].CP1 * fW * fVV3 + + IN[1].CP2 * fU * fVV3 + + HSIN.CPCenter * 6.0f * fW * fU * fV; + + // Flat position: + float3 flatPosition = IN[0].worldPosition * fW + IN[1].worldPosition * fU + IN[2].worldPosition * fV; + + // allow user to blend between PN tessellation and flat tessellation: + position = lerp(position, flatPosition, FlatTessellation); + + // Interpolate normal + float3 normal = IN[0].worldNormal * fW + IN[1].worldNormal * fU + IN[2].worldNormal * fV; + + // Normalize the interpolated normal + OUT.worldNormal = normalize(normal); + + // Compute tangent: + float3 tangent = IN[0].worldTangent.xyz * fW + IN[1].worldTangent.xyz * fU + IN[2].worldTangent.xyz * fV; + OUT.worldTangent.xyz = normalize(tangent.xyz); + + // Pass through the direction of the binormal as calculated in the vertex shader + OUT.worldTangent.w = IN[0].worldTangent.w; + + // Linear interpolate the texture coords + OUT.texCoord0 = IN[0].texCoord0 * fW + IN[1].texCoord0 * fU + IN[2].texCoord0 * fV; + OUT.texCoord1 = IN[0].texCoord1 * fW + IN[1].texCoord1 * fU + IN[2].texCoord1 * fV; + OUT.texCoord2 = IN[0].texCoord2 * fW + IN[1].texCoord2 * fU + IN[2].texCoord2 * fV; + + // apply displacement map (only when not rendering the Maya preview swatch): + if (UseDisplacementMap && !IsSwatchRender) { + // Fix Displacement Seams. + // we assume here that the displacement UVs is UVset 0. + // if this UVset index is changed, it should als be changed in the hull shader + // PN-AEN 18 with displacement UV seam fix + float2 displaceUV = pickTexcoord(DisplacementTexcoord, OUT.texCoord0, OUT.texCoord1, OUT.texCoord2); + float3 displacementUVW = PickDominant(float3(displaceUV, 0), fU, fV, fW, + float3(IN[0].dominantEdge.xy, 0), float3(IN[0].dominantEdge.zw, 0), + float3(IN[1].dominantEdge.xy, 0), float3(IN[1].dominantEdge.zw, 0), + float3(IN[2].dominantEdge.xy, 0), float3(IN[2].dominantEdge.zw, 0), + float3(IN[0].dominantVertex.xy, 0), + float3(IN[1].dominantVertex.xy, 0), + float3(IN[2].dominantVertex.xy, 0)); + + // We can still get cracks here because the world tangent and normal may be different for vertices on each side of the UV seam, + // because we do the tangent to world conversion, we get the same diplacement amount, but it results in different movement once converted to world space. + // And even a tiny difference between normal or tangent will cause large cracks. + float3 displacementNormal = PickDominant(OUT.worldNormal, + fU, fV, fW, + IN[0].dominantNormalE0, IN[0].dominantNormalE1, + IN[1].dominantNormalE0, IN[1].dominantNormalE1, + IN[2].dominantNormalE0, IN[2].dominantNormalE1, + IN[0].dominantNormalCorner, + IN[1].dominantNormalCorner, + IN[2].dominantNormalCorner); + + displacementNormal = normalize(displacementNormal); + + if (DisplacementModel == 1) { // Tangent Vector Displacement + float3 displacementTangent = PickDominant(OUT.worldTangent.xyz, fU, fV, fW, + IN[0].dominantTangentE0, IN[0].dominantTangentE1, + IN[1].dominantTangentE0, IN[1].dominantTangentE1, + IN[2].dominantTangentE0, IN[2].dominantTangentE1, + IN[0].dominantTangentCorner, + IN[1].dominantTangentCorner, + IN[2].dominantTangentCorner); + + displacementTangent = normalize(displacementTangent); + + float3 vecDisp = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).xyz; + vecDisp -= DisplacementOffset; + + float3 Bn = cross(displacementNormal, displacementTangent); + float3x3 toWorld = float3x3(displacementTangent, Bn.xyz, displacementNormal); + + float3 VDMcoordSys = vecDisp.xzy; // Mudbox + if (VectorDisplacementCoordSys == 1) { + VDMcoordSys = vecDisp.xyz; // Maya or ZBrush + } + + float3 vecDispW = mul(VDMcoordSys, toWorld) * DisplacementHeight; + position.xyz += vecDispW; + } else { + // offset (-0.5) so that we can have negative displacement also + float offset = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).x - DisplacementOffset; + position.xyz += displacementNormal * offset * DisplacementHeight; + } + } + + // Update World Position value for inside pixel shader: + OUT.worldPosition = position.xyz; + + // Transform model position with view-projection matrix + //OUT.position = float4(position.xyz, 1); // with geo + OUT.position = mul(float4(position.xyz, 1), viewPrj); // without geo + + return OUT; +} + +//------------------------------------ +// Geometry Shader +//------------------------------------ +// This is a sample Geo shader. Disabled in this shader, but left here for your reference. +// If you wish to enable it, search for 'with geo' in this shader for code to change. +[maxvertexcount(3)] // Declaration for the maximum number of vertices to create +void GS(triangle SHADERDATA IN[3], inout TriangleStream TriStream) { + SHADERDATA OUT; + + // quick test to see if geo also works: + for (int i = 0; i<3; ++i) { + OUT = IN[i]; + OUT.position = mul(mul(float4(OUT.position.xyz, 1), view), prj); + TriStream.Append(OUT); + } + TriStream.RestartStrip(); // end triangle +} +#endif + +void sampleMasks() { + +} + +//------------------------------------ +// pixel shader +//------------------------------------ +float4 f(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) : SV_Target { +#ifdef _3DSMAX_ + FrontFace = !FrontFace; +#endif + // clip are early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float gammaCorrection = lerp(1.0, 2.2, LinearSpaceLighting); + + float3 N = normalize(IN.worldNormal.xyz); + if (flipBackfaceNormals) { + N = lerp(-N, N, FrontFace); + } + float3 Nw = N; + + // Tangent and BiNormal: + float3 T = normalize(IN.worldTangent.xyz); + float3 Bn = cross(N, T); + Bn *= IN.worldTangent.w; + + float4 diffuse = float4(1, 1, 1, 1); + if (UseDiffuseTexture) { + float2 diffuseUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 diffuseTextureSample = DiffuseTexture.Sample(SamplerAnisoWrap, diffuseUV); + + if (UseDiffuseTextureAlpha) { + diffuse.a = diffuseTextureSample.a; + } + + diffuse.rgb *= pow(diffuseTextureSample.rgb, gammaCorrection); + } + + float3 microNormal = float3(0, 0, 1); + if (UseNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(NormalTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 NormalMap = NormalTexture.Sample(SamplerAnisoWrap, normalUV).xyz * 2.0 - 1.0; + float3 backupNormal = NormalMap; + + if (NormalCoordsysX > 0) + NormalMap.x = -NormalMap.x; + if (NormalCoordsysY > 0) + NormalMap.y = -NormalMap.y; + + NormalMap.xy *= NormalHeight; + + if (UseMicroNormalTexture) { + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + NormalMap.xy += microNormal.xy; + } + + if (UseBlendTexture) { + float2 blendUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + + + + + + + } + NormalMap = mul(NormalMap.xyz, toWorld); + N = normalize(NormalMap); + } else { + if (UseMicroNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + microNormal = mul(microNormal.xyz, toWorld); + } + } + + diffuse.rgb *= DiffuseColor; + + float3 blurredNormal = lerp(N, Nw, NormalBlurring); + + float3 V = normalize(viewInv[3].xyz - IN.worldPosition.xyz); + + float4 specular = float4(0.028, 0.028, 0.028, 1); + specular.rgb *= SpecularColor; + + if (UseSpecularTexture) { + float2 opacityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 SpecularTextureSample = SpecularTexture.Sample(SamplerAnisoWrap, opacityUV); + + specular.rgb *= pow(SpecularTextureSample.rgb, gammaCorrection); + + if (UseSpecularTextureAlpha) { + specular.a = SpecularTextureSample.a; + } + } + + float cavity = 1; + if (UseCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float CavityTextureSample = CavityTexture.Sample(SamplerAnisoWrap, cavityUV); + + cavity = lerp(1, pow(CavityTextureSample, gammaCorrection), CavityAmount); + } + + float microCavity = 1; + if (UseMicroCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float MicroCavityTextureSample = MicroCavityTexture.Sample(SamplerAnisoWrap, cavityUV * MicroScale); + + microCavity = lerp(1, pow(MicroCavityTextureSample, gammaCorrection), MicroCavityAmount); + } + + specular.rgb *= cavity * microCavity; // We apply cavity on the specular before it is sent to the fresnel + + float roughness = Roughness; + if (UseSpecularTextureAlpha) { + roughness *= specular.a; + } + + float scatteringRadius = 1; + if (UseScatteringRadiusTexture) { + float2 scatteringUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 scatteringRadiusTextureSample = ScatteringRadiusTexture.Sample(SamplerAnisoWrap, scatteringUV); + + scatteringRadius *= pow(scatteringRadiusTextureSample, gammaCorrection); + } + + // Opacity: + float opacity = saturate(diffuse.a * Opacity); + + // Occlusion: + float3 ambientOcclusion = float3(1, 1, 1); + if (UseAmbientOcclusionTexture) { + float2 aomapUV = pickTexcoord(OcclusionTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 aomapTextureSample = OcclusionTexture.Sample(SamplerAnisoWrap, aomapUV).rgb; + ambientOcclusion *= lerp(1, pow(aomapTextureSample.rgb, gammaCorrection), OcclusionAmount); + } + + float3 thickness = float3(1, 1, 1); + if (UseThicknessTexture) { + float2 thicknessUV = pickTexcoord(ThicknessTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + thickness = pow(BackScatteringThicknessTexture.Sample(SamplerAnisoWrap, thicknessUV), gammaCorrection).xyz; + } + + float3 skinOcclusion = coloredOcclusion(diffuse, ambientOcclusion); // Colored occlusion for skin + + float softenMask = 1.0f; + + float2 screenCoord = IN.screenCoord.xy / IN.screenCoord.w; + //float2 currentScreenSize = screenSize; // TO DO FIND A WAY TO GET SCREEN SIZE, MAYA BUG ? + float2 currentScreenSize = float2(1024, 512); + + // -------- + // LIGHTS: + // -------- + // future todo: Maya could pass light info in array so we can loop any number of lights. + + // light 0: + lightOut light0 = CalculateLight(light0Enable, light0Type, light0AttenScale, light0Pos, IN.worldPosition.xyz, + light0Color, light0Intensity, light0Dir, light0ConeAngle, light0FallOff, light0Matrix, + light0ShadowMap, light0ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 1: + lightOut light1 = CalculateLight(light1Enable, light1Type, light1AttenScale, light1Pos, IN.worldPosition.xyz, + light1Color, light1Intensity, light1Dir, light1ConeAngle, light1FallOff, light1Matrix, + light1ShadowMap, light1ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 2: + lightOut light2 = CalculateLight(light2Enable, light2Type, light2AttenScale, light2Pos, IN.worldPosition.xyz, + light2Color, light2Intensity, light2Dir, light2ConeAngle, light2FallOff, light2Matrix, + light2ShadowMap, light2ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + float3 lightTotal = light0.Color + light1.Color + light2.Color; + + + // ---------------------- + // IMAGE BASED LIGHTING + // ---------------------- + + // Specular IBL + float3 specularIBL = float3(0, 0, 0); + bool reflectMapUsed = UseSpecCubeIBL; + if (reflectMapUsed) { + int lod = 7; // Hard coded mip map level + + float3 reflectionVector = reflect(-V, N); + + reflectionVector = RotateVectorYaw(reflectionVector, SkyRotation); + reflectionVector = normalize(reflectionVector); + float NdotV = saturate(dot(N, V)); + float3 F = F_LagardeSchlick(specular, 1 - roughness, NdotV); + + specularIBL += SpecularCubeIBL.SampleLevel(CubeMapSampler, reflectionVector, lod * roughness).rgb * F; + } + + // Diffuse IBL + float3 diffuseIBL = float3(0, 0, 0); + bool useDiffuseIBL = UseDiffuseIBLMap; + if (useDiffuseIBL) { + // We use the world normal to sample the lighting texture + float3 diffuseIBLVec_High = N; + float3 diffuseIBLVec_Low = blurredNormal; + + diffuseIBLVec_High = RotateVectorYaw(diffuseIBLVec_High, SkyRotation); + diffuseIBLVec_High = normalize(diffuseIBLVec_High); + + diffuseIBLVec_Low = RotateVectorYaw(diffuseIBLVec_Low, SkyRotation); + diffuseIBLVec_Low = normalize(diffuseIBLVec_Low); + + float3 diffuseIBL_High = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_High, 0).rgb; + float3 diffuseIBL_Low = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_Low, 0).rgb; + + diffuseIBL = diffuseSkinIBL(float3(skinCoeffX, skinCoeffY, skinCoeffZ), diffuseIBL_High, diffuseIBL_Low); + } + + // ---------------------- + // FINAL COLOR AND ALPHA: + // ---------------------- + + float3 result = float3(0, 0, 0); + + result += diffuse * diffuseIBL * DiffuseIBLIntensity * skinOcclusion; + + result += specularIBL * SpecularIBLIntensity * specularOcclusion(N, V, ambientOcclusion); + + result += lightTotal; + + //result = N; + + // do gamma correction in shader: + if (!MayaFullScreenGamma) + result = pow(result, 1 / gammaCorrection); + + // final alpha: + float transparency = opacity; + transparency = saturate(transparency); // keep 0-1 range + + return float4(result, transparency); +} + + +#ifdef _MAYA_ +void Peel(SHADERDATA IN) { + float currZ = abs(mul(float4(IN.worldPosition, 1.0f), view).z); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + float2 UV = Pndc.xy / Pndc.w * float2(0.5f, -0.5f) + 0.5f; + float prevZ = transpDepthTexture.Sample(SamplerShadowDepth, UV).r; + float opaqZ = opaqueDepthTexture.Sample(SamplerShadowDepth, UV).r; + float bias = 0.00002f; + + if (currZ < prevZ * (1.0f + bias) || currZ > opaqZ * (1.0f - bias)) { + discard; + } +} + +float4 LinearDepth(SHADERDATA IN) { + return abs(mul(float4(IN.worldPosition, 1.0f), view).z); +} + +float4 DepthComplexity(float opacity) { + return opacity > 0.001f ? 1.0f : 0.0f; +} + +struct MultiOut2 { + float4 target0 : SV_Target0; + float4 target1 : SV_Target1; +}; + +MultiOut2 fTransparentPeel(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = LinearDepth(IN); + return OUT; +} + +MultiOut2 fTransparentPeelAndAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +MultiOut2 fTransparentWeightedAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +//------------------------------------ +// wireframe pixel shader +//------------------------------------ +float4 fwire(SHADERDATA IN) : SV_Target { + return float4(0, 0, 1, 1); +} + + +//------------------------------------ +// pixel shader for shadow map generation +//------------------------------------ +//float4 ShadowMapPS( float3 Pw, float4x4 shadowViewProj ) +float4 ShadowMapPS(SHADERDATA IN) : SV_Target { + // clip as early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + + // divide Z and W component from clip space vertex position to get final depth per pixel + float retZ = Pndc.z / Pndc.w; + + retZ += fwidth(retZ); + return retZ.xxxx; +} +#endif + +//----------------------------------- +// Objects without tessellation +//------------------------------------ +technique11 TessellationOFF < + bool overridesDrawState = false; // we do not supply our own render state settings + int isTransparent = 3; + // objects with clipped pixels need to be flagged as isTransparent to avoid the occluding underlying geometry since Maya renders the object with flat shading when computing depth + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + // 'VariableNameAsAttributeName = false' can be used to tell Maya's DX11ShaderNode to use the UIName annotation string for the Maya attribute name instead of the shader variable name. + // When changing this option, the attribute names generated for the shader inside Maya will change and this can have the side effect that older scenes have their shader attributes reset to default. + // bool VariableNameAsAttributeName = false; + +#ifdef _MAYA_ + // Tells Maya that the effect supports advanced transparency algorithm, + // otherwise Maya would render the associated objects simply by alpha + // blending on top of other objects supporting advanced transparency + // when the viewport transparency algorithm is set to depth-peeling or + // weighted-average. + bool supportsAdvancedTransparency = true; +#endif +> +{ + pass p0 < string drawContext = "colorPass"; > { // tell maya during what draw context this shader should be active, in this case 'Color' + // even though overrideDrawState is false, we still set the pre-multiplied alpha state here in + // case Maya is using 'Depth Peeling' transparency algorithm + // This unfortunately won't solve sorting issues, but at least our object can draw transparent. + // If we don't set this, the object will always be opaque. + // In the future, hopefully ShaderOverride nodes can participate properly in Maya's Depth Peeling setup +#ifdef _MAYA_ + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); +#endif + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, f())); + } + +#ifdef _MAYA_ + pass pTransparentPeel < string drawContext = "transparentPeel"; > { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +#endif +} + +#ifdef _SUPPORTTESSELLATION_ +//----------------------------------- +// Objects with tessellation +//------------------------------------ +// Vertex Index Buffer options: +// index_buffer_type: None; // no divergent normals and no displacement crack fix +// index_buffer_type: PNAEN9; // divergent normals crack fix; no displacement UV seam crack fix +// index_buffer_type: PNAEN18, // crack fix for divergent normals and UV seam displacement +technique11 TessellationON < + string index_buffer_type = "PNAEN18"; // tell Maya what type of index buffer we want. Must be unique name per generator + bool overridesDrawState = false; + int isTransparent = 3; + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + bool supportsAdvancedTransparency = true; > { + pass p0 < string drawContext = "colorPass"; > { + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, f())); + } + + pass pTransparentPeel < string drawContext = "transparentPeel";> { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +} + +//----------------------------------- +// Wireframe +//------------------------------------ +technique11 WireFrame < + string index_buffer_type = "PNAEN18"; + bool overridesDrawState = false; // since we only change the fillMode, it can remain on false. If we changed the blend state, it would have to be true + int isTransparent = 0; > { + pass p0 < string drawContext = "colorPass"; > { + SetRasterizerState(WireframeCullFront); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, fwire())); + } +} +#endif diff --git a/data/shaders/dx11_shd_head.fx b/data/shaders/dx11_shd_head.fx new file mode 100644 index 00000000..9b38d5ab --- /dev/null +++ b/data/shaders/dx11_shd_head.fx @@ -0,0 +1,4271 @@ +// Maya Skin shader made by Charles Greivelding 2014 + +//------------------------------------ +// Notes +//------------------------------------ +// Shader uses 'pre-multiplied alpha' as its render state and this Uber Shader is build to work in unison with that. +// Alternatively, in Maya, the dx11Shader node allows you to set your own render states by supplying the 'overridesDrawState' annotation in the technique +// You may find it harder to get proper transparency sorting if you choose to do so. + +// The technique annotation 'isTransparent' is used to tell Maya how treat the technique with respect to transparency. +// - If set to 0 the technique is always considered opaque +// - If set to 1 the technique is always considered transparent +// - If set to 2 the plugin will check if the parameter marked with the OPACITY semantic is less than 1.0 +// - If set to 3 the plugin will use the transparencyTest annotation to create a MEL procedure to perform the desired test. +// Maya will then render the object twice. Front faces follow by back faces. + +// For some objects you may need to switch the Transparency Algorithm to 'Depth Peeling' to avoid transparency issues. +// Models that require this usually have internal faces. + +//------------------------------------ +// Defines +//------------------------------------ +// how many mip map levels should Maya generate or load per texture. +// 0 means all possible levels +// some textures may override this value, but most textures will follow whatever we have defined here +// If you wish to optimize performance (at the cost of reduced quality), you can set NumberOfMipMaps below to 1 + +#define NumberOfMipMaps 0 +#define PI 3.1415926 +#define _3DSMAX_SPIN_MAX 99999 + +#ifndef _MAYA_ +#define _3DSMAX_ // at time of writing this shader, Nitrous driver did not have the _3DSMAX_ define set +#define _ZUP_ // Maya is Y up, 3dsMax is Z up +#endif + +#ifdef _MAYA_ +#define _SUPPORTTESSELLATION_ // at time of writing this shader, 3dsMax did not support tessellation +#endif + +//------------------------------------ +// State +//------------------------------------ +#ifdef _MAYA_ +RasterizerState WireframeCullFront { + CullMode = Front; + FillMode = WIREFRAME; +}; + +BlendState PMAlphaBlending { + AlphaToCoverageEnable = FALSE; + BlendEnable[0] = TRUE; + SrcBlend = ONE; + DestBlend = INV_SRC_ALPHA; + BlendOp = ADD; + SrcBlendAlpha = ONE; // Required for hardware frame render alpha channel + DestBlendAlpha = INV_SRC_ALPHA; + BlendOpAlpha = ADD; + RenderTargetWriteMask[0] = 0x0F; +}; +#endif + +//------------------------------------ +// Map Channels +//------------------------------------ +#ifdef _3DSMAX_ +int texcoord0 : Texcoord < + int Texcoord = 0; + int MapChannel = 1; + string UIWidget = "None"; +>; + +int texcoord1 : Texcoord < + int Texcoord = 1; + int MapChannel = 2; + string UIWidget = "None"; +>; + +int texcoord2 : Texcoord < + int Texcoord = 2; + int MapChannel = 3; + string UIWidget = "None"; +>; +#endif + +//------------------------------------ +// Samplers +//------------------------------------ +SamplerState CubeMapSampler { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; +}; + +SamplerState SamplerAnisoWrap { + Filter = ANISOTROPIC; + AddressU = Wrap; + AddressV = Wrap; +}; + +SamplerState SamplerAnisoClamp { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; +}; + +SamplerState SamplerShadowDepth { + Filter = MIN_MAG_MIP_POINT; + AddressU = Border; + AddressV = Border; + BorderColor = float4(1.0f, 1.0f, 1.0f, 1.0f); +}; + +//------------------------------------ +// Textures +//------------------------------------ + +Texture2D LutTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS LUT Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +Texture2D DitherTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Dither Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +// --------------------------------------------- +// Blend GROUP +// --------------------------------------------- + +bool UseBlendTexture < + string UIGroup = "Wrinkle mixing"; + string UIName = "Enable Wrinkle Mixing"; + int UIOrder = 919; +> = false; + +Texture2D animNormalMap_00 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 00"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 948; + int UVEditorOrder = 2; +>; + +Texture2D animNormalMap_01 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 01"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 949; + int UVEditorOrder = 2; +>; + +Texture2D animNormalMap_02 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Wrinkle Map 02"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 950; + int UVEditorOrder = 2; +>; + + +Texture2D animColorMap_00 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 00"; + string ResourceType = "2D"; + int UIOrder = 951; + int UVEditorOrder = 2; +>; + +Texture2D animColorMap_01 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 01"; + string ResourceType = "2D"; + int UIOrder = 952; + int UVEditorOrder = 2; +>; + +Texture2D animColorMap_02 < + string UIGroup = "Animated Maps"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Blood Flow 02"; + string ResourceType = "2D"; + int UIOrder = 953; + int UVEditorOrder = 2; +>; + + +Texture2D maskChannel_00 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 00 Mask"; + string ResourceType = "2D"; + int UIOrder = 948; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_01 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 01 Mask"; + string ResourceType = "2D"; + int UIOrder = 949; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_02 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 02 Mask"; + string ResourceType = "2D"; + int UIOrder = 950; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_03 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 03 Mask"; + string ResourceType = "2D"; + int UIOrder = 951; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_04 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 04 Mask"; + string ResourceType = "2D"; + int UIOrder = 952; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_05 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 05 Mask"; + string ResourceType = "2D"; + int UIOrder = 953; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_06 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 06 Mask"; + string ResourceType = "2D"; + int UIOrder = 954; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_07 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 07 Mask"; + string ResourceType = "2D"; + int UIOrder = 955; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_08 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 08 Mask"; + string ResourceType = "2D"; + int UIOrder = 956; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_09 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 09 Mask"; + string ResourceType = "2D"; + int UIOrder = 957; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_10 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 10 Mask"; + string ResourceType = "2D"; + int UIOrder = 958; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_11 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 11 Mask"; + string ResourceType = "2D"; + int UIOrder = 959; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_12 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 12 Mask"; + string ResourceType = "2D"; + int UIOrder = 960; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_13 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 13 Mask"; + string ResourceType = "2D"; + int UIOrder = 961; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_14 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 14 Mask"; + string ResourceType = "2D"; + int UIOrder = 962; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_15 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 15 Mask"; + string ResourceType = "2D"; + int UIOrder = 963; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_16 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 16 Mask"; + string ResourceType = "2D"; + int UIOrder = 964; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_17 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 17 Mask"; + string ResourceType = "2D"; + int UIOrder = 965; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_18 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 18 Mask"; + string ResourceType = "2D"; + int UIOrder = 966; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_19 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 19 Mask"; + string ResourceType = "2D"; + int UIOrder = 967; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_20 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 20 Mask"; + string ResourceType = "2D"; + int UIOrder = 968; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_21 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 21 Mask"; + string ResourceType = "2D"; + int UIOrder = 969; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_22 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 22 Mask"; + string ResourceType = "2D"; + int UIOrder = 970; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_23 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 23 Mask"; + string ResourceType = "2D"; + int UIOrder = 971; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_24 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 24 Mask"; + string ResourceType = "2D"; + int UIOrder = 972; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_25 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 25 Mask"; + string ResourceType = "2D"; + int UIOrder = 973; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_26 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 26 Mask"; + string ResourceType = "2D"; + int UIOrder = 974; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_27 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 27 Mask"; + string ResourceType = "2D"; + int UIOrder = 975; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_28 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 28 Mask"; + string ResourceType = "2D"; + int UIOrder = 976; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_29 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 29 Mask"; + string ResourceType = "2D"; + int UIOrder = 977; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_30 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 30 Mask"; + string ResourceType = "2D"; + int UIOrder = 978; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_31 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 31 Mask"; + string ResourceType = "2D"; + int UIOrder = 979; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_32 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 32 Mask"; + string ResourceType = "2D"; + int UIOrder = 980; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_33 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 33 Mask"; + string ResourceType = "2D"; + int UIOrder = 981; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_34 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 34 Mask"; + string ResourceType = "2D"; + int UIOrder = 982; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_35 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 35 Mask"; + string ResourceType = "2D"; + int UIOrder = 983; + int UVEditorOrder = 2; +>; + +Texture2D maskChannel_36 < + string UIGroup = "Masks"; + string ResourceName = ""; + string UIWidget = "File Picker"; + string UIName = "Channel 36 Mask"; + string ResourceType = "2D"; + int UIOrder = 984; + int UVEditorOrder = 2; +>; + + +float maskWeight_00 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 00 Multiplier"; + float UIStep = 0.01; + int UIOrder = 954; +> = 0.0; + +float maskWeight_01 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 01 Multiplier"; + float UIStep = 0.01; + int UIOrder = 955; +> = 0.0; + +float maskWeight_02 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 02 Multiplier"; + float UIStep = 0.01; + int UIOrder = 956; +> = 0.0; + +float maskWeight_03 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 03 Multiplier"; + float UIStep = 0.01; + int UIOrder = 957; +> = 0.0; + +float maskWeight_04 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 04 Multiplier"; + float UIStep = 0.01; + int UIOrder = 958; +> = 0.0; + +float maskWeight_05 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 05 Multiplier"; + float UIStep = 0.01; + int UIOrder = 959; +> = 0.0; + +float maskWeight_06 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 06 Multiplier"; + float UIStep = 0.01; + int UIOrder = 960; +> = 0.0; + +float maskWeight_07 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 07 Multiplier"; + float UIStep = 0.01; + int UIOrder = 961; +> = 0.0; + +float maskWeight_08 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 08 Multiplier"; + float UIStep = 0.01; + int UIOrder = 962; +> = 0.0; + +float maskWeight_09 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 09 Multiplier"; + float UIStep = 0.01; + int UIOrder = 963; +> = 0.0; + +float maskWeight_10 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 10 Multiplier"; + float UIStep = 0.01; + int UIOrder = 964; +> = 0.0; + +float maskWeight_11 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 11 Multiplier"; + float UIStep = 0.01; + int UIOrder = 965; +> = 0.0; + +float maskWeight_12 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 12 Multiplier"; + float UIStep = 0.01; + int UIOrder = 966; +> = 0.0; + +float maskWeight_13 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 13 Multiplier"; + float UIStep = 0.01; + int UIOrder = 967; +> = 0.0; + +float maskWeight_14 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 14 Multiplier"; + float UIStep = 0.01; + int UIOrder = 968; +> = 0.0; + +float maskWeight_15 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 15 Multiplier"; + float UIStep = 0.01; + int UIOrder = 969; +> = 0.0; + +float maskWeight_16 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 16 Multiplier"; + float UIStep = 0.01; + int UIOrder = 970; +> = 0.0; + +float maskWeight_17 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 17 Multiplier"; + float UIStep = 0.01; + int UIOrder = 971; +> = 0.0; + +float maskWeight_18 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 18 Multiplier"; + float UIStep = 0.01; + int UIOrder = 972; +> = 0.0; + +float maskWeight_19 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 19 Multiplier"; + float UIStep = 0.01; + int UIOrder = 973; +> = 0.0; + +float maskWeight_20 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 20 Multiplier"; + float UIStep = 0.01; + int UIOrder = 974; +> = 0.0; + +float maskWeight_21 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 21 Multiplier"; + float UIStep = 0.01; + int UIOrder = 975; +> = 0.0; + +float maskWeight_22 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 22 Multiplier"; + float UIStep = 0.01; + int UIOrder = 976; +> = 0.0; + +float maskWeight_23 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 23 Multiplier"; + float UIStep = 0.01; + int UIOrder = 977; +> = 0.0; + +float maskWeight_24 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 24 Multiplier"; + float UIStep = 0.01; + int UIOrder = 978; +> = 0.0; + +float maskWeight_25 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 25 Multiplier"; + float UIStep = 0.01; + int UIOrder = 979; +> = 0.0; + +float maskWeight_26 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 26 Multiplier"; + float UIStep = 0.01; + int UIOrder = 980; +> = 0.0; + +float maskWeight_27 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 27 Multiplier"; + float UIStep = 0.01; + int UIOrder = 981; +> = 0.0; + +float maskWeight_28 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 28 Multiplier"; + float UIStep = 0.01; + int UIOrder = 982; +> = 0.0; + +float maskWeight_29 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 29 Multiplier"; + float UIStep = 0.01; + int UIOrder = 983; +> = 0.0; + +float maskWeight_30 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 30 Multiplier"; + float UIStep = 0.01; + int UIOrder = 984; +> = 0.0; + +float maskWeight_31 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 31 Multiplier"; + float UIStep = 0.01; + int UIOrder = 985; +> = 0.0; + +float maskWeight_32 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 32 Multiplier"; + float UIStep = 0.01; + int UIOrder = 986; +> = 0.0; + +float maskWeight_33 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 33 Multiplier"; + float UIStep = 0.01; + int UIOrder = 987; +> = 0.0; + +float maskWeight_34 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 34 Multiplier"; + float UIStep = 0.01; + int UIOrder = 988; +> = 0.0; + +float maskWeight_35 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 35 Multiplier"; + float UIStep = 0.01; + int UIOrder = 989; +> = 0.0; + +float maskWeight_36 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 36 Multiplier"; + float UIStep = 0.01; + int UIOrder = 990; +> = 0.0; + +float maskWeight_37 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 37 Multiplier"; + float UIStep = 0.01; + int UIOrder = 991; +> = 0.0; + +float maskWeight_38 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 38 Multiplier"; + float UIStep = 0.01; + int UIOrder = 992; +> = 0.0; + +float maskWeight_39 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 39 Multiplier"; + float UIStep = 0.01; + int UIOrder = 993; +> = 0.0; + +float maskWeight_40 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 40 Multiplier"; + float UIStep = 0.01; + int UIOrder = 994; +> = 0.0; + +float maskWeight_41 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 41 Multiplier"; + float UIStep = 0.01; + int UIOrder = 995; +> = 0.0; + +float maskWeight_42 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 42 Multiplier"; + float UIStep = 0.01; + int UIOrder = 996; +> = 0.0; + +float maskWeight_43 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 43 Multiplier"; + float UIStep = 0.01; + int UIOrder = 997; +> = 0.0; + +float maskWeight_44 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 44 Multiplier"; + float UIStep = 0.01; + int UIOrder = 998; +> = 0.0; + +float maskWeight_45 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 45 Multiplier"; + float UIStep = 0.01; + int UIOrder = 999; +> = 0.0; + +float maskWeight_46 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 46 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1000; +> = 0.0; + +float maskWeight_47 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 47 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1001; +> = 0.0; + +float maskWeight_48 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 48 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1002; +> = 0.0; + +float maskWeight_49 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 49 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1003; +> = 0.0; + +float maskWeight_50 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 50 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1004; +> = 0.0; + +float maskWeight_51 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 51 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1005; +> = 0.0; + +float maskWeight_52 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 52 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1006; +> = 0.0; + +float maskWeight_53 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 53 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1007; +> = 0.0; + +float maskWeight_54 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 54 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1008; +> = 0.0; + +float maskWeight_55 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 55 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1009; +> = 0.0; + +float maskWeight_56 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 56 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1010; +> = 0.0; + +float maskWeight_57 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 57 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1011; +> = 0.0; + +float maskWeight_58 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 58 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1012; +> = 0.0; + +float maskWeight_59 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 59 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1013; +> = 0.0; + +float maskWeight_60 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 60 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1014; +> = 0.0; + +float maskWeight_61 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 61 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1015; +> = 0.0; + +float maskWeight_62 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 62 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1016; +> = 0.0; + +float maskWeight_63 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 63 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1017; +> = 0.0; + +float maskWeight_64 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 64 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1018; +> = 0.0; + +float maskWeight_65 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 65 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1019; +> = 0.0; + +float maskWeight_66 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 66 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1020; +> = 0.0; + +float maskWeight_67 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 67 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1021; +> = 0.0; + +float maskWeight_68 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 68 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1022; +> = 0.0; + +float maskWeight_69 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 69 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1023; +> = 0.0; + +float maskWeight_70 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 70 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1024; +> = 0.0; + +float maskWeight_71 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 71 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1025; +> = 0.0; + +float maskWeight_72 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 72 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1026; +> = 0.0; + +float maskWeight_73 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 73 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1027; +> = 0.0; + +float maskWeight_74 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 74 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1028; +> = 0.0; + +float maskWeight_75 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 75 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1029; +> = 0.0; + +float maskWeight_76 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 76 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1030; +> = 0.0; + +float maskWeight_77 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 77 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1031; +> = 0.0; + +float maskWeight_78 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 78 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1032; +> = 0.0; + +float maskWeight_79 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 79 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1033; +> = 0.0; + +float maskWeight_80 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 80 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1034; +> = 0.0; + +float maskWeight_81 < + string UIGroup = "Multipliers"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + string UIName = "Channel 81 Multiplier"; + float UIStep = 0.01; + int UIOrder = 1035; +> = 0.0; + + + +Texture2D OcclusionTexture < + string UIGroup = "Occlusion"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Ambient Occlusion Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 401; + int UVEditorOrder = 2; +>; + +Texture2D ScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Radius Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 209; + int UVEditorOrder = 2; +>; + +Texture2D CavityTexture < + string UIGroup = "Cavity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 501; + int UVEditorOrder = 4; +>; + +Texture2D DiffuseTexture < + string UIGroup = "Diffuse"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 201; + int UVEditorOrder = 1; +>; + +Texture2D SpecularTexture < + string UIGroup = "Specular"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 302; + int UVEditorOrder = 4; +>; + +Texture2D NormalTexture < + string UIGroup = "Normal"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; // If mip maps exist in texture, Maya will load them. So user can pre-calculate and re-normalize mip maps for normal maps in .dds + int UIOrder = 601; + int UVEditorOrder = 5; +>; + +Texture2D MicroCavityTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 701; + int UVEditorOrder = 5; +>; + +Texture2D MicroNormalTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 704; + int UVEditorOrder = 5; +>; + +#ifdef _SUPPORTTESSELLATION_ +Texture2D DisplacementTexture < + string UIGroup = "Tessellation and Displacement"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Displacement Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 902; + int UVEditorOrder = 8; +>; +#endif + +Texture2D BackScatteringThicknessTexture < + string UIGroup = "BackScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Thickness Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 215; + int UVEditorOrder = 10; +>; + +Texture2D OpacityMaskTexture < + string UIGroup = "Opacity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Opacity Mask"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 800; + int UVEditorOrder = 12; +>; + +TextureCube DiffuseCubeIBL < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; // Use (or load) max number of mip map levels so we can use blurring + int UIOrder = 108; + int UVEditorOrder = 10; +>; + +TextureCube SpecularCubeIBL : environment < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; + int UIOrder = 111; + int UVEditorOrder = 6; +>; + +//------------------------------------ +// Shadow Maps +//------------------------------------ +Texture2D light0ShadowMap : SHADOWMAP < + string Object = "Light 0"; // UI Group for lights, auto-closed + string UIWidget = "None"; + int UIOrder = 5010; +>; + +Texture2D light1ShadowMap : SHADOWMAP < + string Object = "Light 1"; + string UIWidget = "None"; + int UIOrder = 5020; +>; + +Texture2D light2ShadowMap : SHADOWMAP < + string Object = "Light 2"; + string UIWidget = "None"; + int UIOrder = 5030; +>; + +//------------------------------------ +// Internal depth textures for Maya depth-peeling transparency +//------------------------------------ +#ifdef _MAYA_ + +Texture2D transpDepthTexture : transpdepthtexture < + string UIWidget = "None"; +>; + +Texture2D opaqueDepthTexture : opaquedepthtexture < + string UIWidget = "None"; +>; + +#endif + +//------------------------------------ +// Per Frame parameters +//------------------------------------ +cbuffer UpdatePerFrame : register(b0) { + float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; + float4x4 view : View < string UIWidget = "None"; >; + float4x4 prj : Projection < string UIWidget = "None"; >; + float4x4 viewPrj : ViewProjection < string UIWidget = "None"; >; + + // A shader may wish to do different actions when Maya is rendering the preview swatch (e.g. disable displacement) + // This value will be true if Maya is rendering the swatch + bool IsSwatchRender : MayaSwatchRender < string UIWidget = "None"; > = false; + float2 screenSize : ViewportPixelSize < string UIWidget = "None"; >; + + // If the user enables viewport gamma correction in Maya's global viewport rendering settings, the shader should not do gamma again + bool MayaFullScreenGamma : MayaGammaCorrection < string UIWidget = "None"; > = false; +} + + +//------------------------------------ +// Per Object parameters +//------------------------------------ +cbuffer UpdatePerObject : register(b1) { + float4x4 world : World < string UIWidget = "None"; >; + float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; +#ifndef _SUPPORTTESSELLATION_ + float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; +#endif + +// --------------------------------------------- +// Lighting Settings GROUP +// --------------------------------------------- +bool LinearSpaceLighting < + string UIGroup = "Lighting Settings"; + string UIName = "Linear Space Lighting"; + int UIOrder = 100; +> = true; + +bool UseShadows < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIName = "Shadows"; + int UIOrder = 101; +#endif +> = true; + +float shadowMultiplier < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UIMax = 1.000; + float UIStep = 0.001; + string UIName = "Shadow Strength"; + int UIOrder = 102; +#endif +> = { 1.0f }; + +// This offset allows you to fix any in-correct self shadowing caused by limited precision. +// This tends to get affected by scene scale and polygon count of the objects involved. +float shadowDepthBias : ShadowMapBias < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UISoftMax = 10.000; + float UIStep = 0.001; + string UIName = "Shadow Bias"; + int UIOrder = 103; +#endif +> = { 0.01f }; + +// flips back facing normals to improve lighting for things like sheets of hair or leaves +bool flipBackfaceNormals < + string UIGroup = "Lighting Settings"; + string UIName = "Double Sided Lighting"; + int UIOrder = 104; +> = true; + +// -- light props are inserted here via UIOrder 20 - 49 + +// --------------------------------------------- +// IBL Settings GROUP +// --------------------------------------------- + +float SkyRotation < + string UIGroup = "IBL Settings"; + string UIName = "Sky Rotation"; + float UISoftMin = 0; + float UISoftMax = 360; + float UIMin = 0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1; + int UIOrder = 105; + string UIWidget = "Slider"; +> = { 0.0f }; + +bool UseDiffuseIBLMap < + string UIGroup = "IBL Settings"; + string UIName = "Use Diffuse Cubemap"; + int UIOrder = 106; +> = false; + +float DiffuseIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Diffuse IBL Intensity"; + int UIOrder = 107; +> = 1.0; + +bool UseSpecCubeIBL < + string UIGroup = "IBL Settings"; + string UIName = "Use Specular Cubemap"; + int UIOrder = 109; +> = false; + +float SpecularIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Specular IBL Intensity"; + int UIOrder = 110; +> = 1.0; + +// --------------------------------------------- +// Diffuse GROUP +// --------------------------------------------- + +bool UseDiffuseTexture < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map"; + int UIOrder = 200; +> = false; + + +bool UseDiffuseTextureAlpha < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map Alpha"; + int UIOrder = 201; +> = false; + +float3 DiffuseColor : Diffuse < + string UIGroup = "Diffuse"; + string UIName = "Diffuse Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 202; +> = { 1.0f, 1.0f, 1.0f }; + +// --------------------------------------------- +// SSS GROUP +// --------------------------------------------- + +float skinCoeffX < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient R"; + int UIOrder = 204; +> = 1.0; + +float skinCoeffY < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient G"; + int UIOrder = 205; +> = 0.5; + +float skinCoeffZ < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient B"; + int UIOrder = 206; +> = 0.25; + +float NormalBlurring < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Softness"; + int UIOrder = 207; +> = 0.25; + +bool UseScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string UIName = "Use SSS Radius Map"; + int UIOrder = 209; +> = false; + +float skinScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Radius"; + int UIOrder = 210; +> = 0.25; + +float shadowBlur < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Blur"; + int UIOrder = 211; +> = 1.0; + +float shadowDither < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Dither"; + int UIOrder = 211; +> = 1.0; + +float shadowScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Scattering"; + int UIOrder = 212; +> = 1.0; + +float shadowSaturation < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 4.0; + float UIMax = 4; + float UIStep = 0.1; + string UIName = "SSS Shadow Saturation"; + int UIOrder = 213; +> = 1.0; + +// --------------------------------------------- +// BackScattering GROUP +// --------------------------------------------- + +bool UseTranslucency < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering"; + int UIOrder = 214; +> = false; + +bool UseThicknessTexture < + string UIGroup = "BackScattering"; + string UIName = "Use Thickness Map"; + int UIOrder = 216; +> = false; + +float skinScatteringRoughness < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Width"; + int UIOrder = 217; +> = 1.0; + +/*float3 skinScatteringInnerColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Inner Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 215; +> = {0.25f, 0.05f, 0.02f };*/ + +float3 skinScatteringOuterColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 218; +> = { 0.25f, 0.05f, 0.02f }; + +float skinScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Amount"; + int UIOrder = 219; +> = 1.0; + +float skinAmbientScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Ambient Amount"; + int UIOrder = 220; +> = 1.0; + +/* float skinScatteringPlane < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Far Plane"; + int UIOrder = 218; +> = 1.0;*/ + +// --------------------------------------------- +// Specular GROUP +// --------------------------------------------- + +bool UseSpecularTexture < + string UIGroup = "Specular"; + string UIName = "Use Specular Map"; + int UIOrder = 301; +> = false; + +bool UseSpecularTextureAlpha < + string UIGroup = "Specular"; + string UIName = "Use Roughness Map Alpha"; + int UIOrder = 301; +> = false; + +float3 SpecularColor : Specular < + string UIGroup = "Specular"; + string UIName = "Specular Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 303; +> = { 1.0f, 1.0f, 1.0f }; + + +float LobeMix < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Lobe Mixing"; + int UIOrder = 304; +> = 0.75; + +float Roughness < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Roughness multiplier"; + int UIOrder = 305; +> = .2; + +// --------------------------------------------- +// Occlusion GROUP +// --------------------------------------------- + +bool UseAmbientOcclusionTexture < + string UIGroup = "Occlusion"; + string UIName = "Use Occlusion Map"; + int UIOrder = 400; +> = false; + +float OcclusionAmount < + string UIGroup = "Occlusion"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Occlusion Amount"; + int UIOrder = 402; +> = 1.0; + +// --------------------------------------------- +// Cavity GROUP +// --------------------------------------------- + +bool UseCavityTexture < + string UIGroup = "Cavity"; + string UIName = "Use Cavity Map"; + int UIOrder = 500; +> = false; + +float CavityAmount < + string UIGroup = "Cavity"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Cavity Amount"; + int UIOrder = 502; +> = 1.0; + +// --------------------------------------------- +// Normal GROUP +// --------------------------------------------- +bool UseNormalTexture < + string UIGroup = "Normal"; + string UIName = "Use Normal Map"; + int UIOrder = 600; +> = false; + +float NormalHeight < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Normal Height"; + int UIOrder = 603; +> = 1.0; + +bool SupportNonUniformScale < + string UIGroup = "Normal"; + string UIName = "Support Non-Uniform Scale"; + int UIOrder = 604; +> = true; + +int NormalCoordsysX < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal X (Red)"; + int UIOrder = 605; +> = 0; + +int NormalCoordsysY < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal Y (Green)"; + int UIOrder = 606; +> = 0; + +// --------------------------------------------- +// Micro Details GROUP +// --------------------------------------------- + +bool UseMicroCavityTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Cavity Map"; + int UIOrder = 700; +> = false; + +float MicroCavityAmount < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Cavity Amount"; + int UIOrder = 702; +> = 1.0; + +bool UseMicroNormalTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Normal Map"; + int UIOrder = 703; +> = false; + +float MicroNormalHeight < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Normal Height"; + int UIOrder = 705; +> = 1.0; + +float MicroScale < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 16.0; + float UISoftMax = 256.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Scale"; + int UIOrder = 706; +> = 32; + +// --------------------------------------------- +// Opacity GROUP +// --------------------------------------------- +float Opacity : OPACITY < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity"; + int UIOrder = 801; +> = 1.0; + +bool UseOpacityMaskTexture < + string UIGroup = "Opacity"; + string UIName = "Opacity Mask"; + int UIOrder = 802; +> = false; + +// at what value do we clip away pixels +float OpacityMaskBias < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity Mask Bias"; + int UIOrder = 803; +> = 0.1; + +#ifdef _SUPPORTTESSELLATION_ +// --------------------------------------------- +// Tessellation and Displacement GROUP +// --------------------------------------------- +int DisplacementModel < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Model"; + string UIFieldNames = "Grayscale:Tangent Vector"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 900; +> = false; + +bool UseDisplacementMap < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Map"; + int UIOrder = 901; +> = false; + +int VectorDisplacementCoordSys < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + string UIFieldNames = "Mudbox (XZY):Maya (XYZ)"; + string UIName = "Displacement Coordsys"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 903; +> = 0; + +float DisplacementHeight < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 10.0; + string UIName = "Displacement Height"; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + int UIOrder = 904; +> = 0.5; + +// This allows you to control what the 'base' value for displacement is. +// When the offset value is 0.5, that means that a gray value (color: 128,128,128) will get 0 displacement. +// A value of 0 would then dent in. +// A value of 1 would then extrude. +float DisplacementOffset < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = -1.0; + float UISoftMax = 1.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + string UIName = "Displacement Offset"; + int UIOrder = 905; +> = 0.5; + +// This gives the artist control to prevent this shader from clipping away faces to quickly when displacement is actually keeping the faces on screen. +// This is also important for e.g. shadow map generation to make sure displaced vertices are not clipped out of the light's view +// See BBoxExtraScale for artist control over Maya clipping the entire object away when it thinks it leaves the view. +float DisplacementClippingBias < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 99.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Displacement Clipping Bias"; + int UIOrder = 906; +> = 5.0; + +// This gives the artist control to prevent maya from clipping away the entire object to fast in case displacement is used. +// Its semantic has to be BoundingBoxExtraScale +float BBoxExtraScale : BoundingBoxExtraScale < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Bounding Box Extra Scale"; + int UIOrder = 907; +> = 1.0; + +float TessellationRange < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 999.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1.0; + string UIName = "Tessellation Range"; + int UIOrder = 908; +> = { 0 }; + +float TessellationMin < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Tessellation Minimum"; + int UIOrder = 909; +> = 3.0; + +float FlatTessellation < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.1; + string UIName = "Flat Tessellation"; + int UIOrder = 910; +> = 0.0; +#endif + +// --------------------------------------------- +// UV assignment GROUP +// --------------------------------------------- +// Use the Surface Data Section to set your UVset names for each Texcoord. +// E.g. TexCoord1 = uv:UVset +// Then pick a Texcoord in the UV Section to use that UVset for a texture. + +int DiffuseTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Diffuse Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2002; +> = 0; + +int OcclusionTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Ambient Occlusion Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2003; +> = 1; + +int OpacityMaskTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Opacity Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2005; +> = 0; + +int SpecularTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Specular Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2006; +> = 0; + +int NormalTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Normal Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2008; +> = 0; + +#ifdef _SUPPORTTESSELLATION_ +int DisplacementTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Displacement Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2010; +> = 0; +#endif + +int ThicknessTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Translucency Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2011; +> = 0; +} //end UpdatePerObject cbuffer + +//------------------------------------ +// Light parameters +//------------------------------------ +cbuffer UpdateLights : register(b2) { +// --------------------------------------------- +// Light 0 GROUP +// --------------------------------------------- +// This value is controlled by Maya to tell us if a light should be calculated +// For example the artist may disable a light in the scene, or choose to see only the selected light +// This flag allows Maya to tell our shader not to contribute this light into the lighting +bool light0Enable : LIGHTENABLE < +string Object = "Light 0"; // UI Group for lights, auto-closed +string UIName = "Enable Light 0"; +int UIOrder = 20; +#ifdef _MAYA_ +> = false; // maya manages lights itself and defaults to no lights +#else +> = true; // in 3dsMax we should have the default light enabled +#endif + +// follows LightParameterInfo::ELightType +// spot = 2, point = 3, directional = 4, ambient = 5, +int light0Type : LIGHTTYPE < + string Object = "Light 0"; + string UIName = "Light 0 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + int UIOrder = 21; + float UIMin = 0; + float UIMax = 5; + float UIStep = 1; +> = 2; // default to spot so the cone angle etc work when "Use Shader Settings" option is used + +float3 light0Pos : POSITION < + string Object = "Light 0"; + string UIName = "Light 0 Position"; + string Space = "World"; + int UIOrder = 22; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +float3 light0Color : LIGHTCOLOR < + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Color"; + string UIWidget = "Color"; + int UIOrder = 23; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light0Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 24; +#endif +> = { 1.0f }; + +float3 light0Dir : DIRECTION < + string Object = "Light 0"; + string UIName = "Light 0 Direction"; + string Space = "World"; + int UIOrder = 25; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light0ConeAngle : HOTSPOT // In radians +#else +float light0ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 26; +#endif +> = { 0.46f }; + +#ifdef _MAYA_ +float light0FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light0FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 27; +#endif +> = { 0.7f }; + +float light0AttenScale : DECAYRATE < + string Object = "Light 0"; + string UIName = "Light 0 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 28; +> = { 0.0 }; + +bool light0ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 29; +#endif +> = true; + +float4x4 light0Matrix : SHADOWMAPMATRIX < + string Object = "Light 0"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 1 GROUP +// --------------------------------------------- +bool light1Enable : LIGHTENABLE < + string Object = "Light 1"; + string UIName = "Enable Light 1"; + int UIOrder = 30; +> = false; + +int light1Type : LIGHTTYPE < + string Object = "Light 1"; + string UIName = "Light 1 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 31; +> = 2; + +float3 light1Pos : POSITION < + string Object = "Light 1"; + string UIName = "Light 1 Position"; + string Space = "World"; + int UIOrder = 32; + int RefID = 1; // 3DSMAX +> = { -100.0f, 100.0f, 100.0f }; + +float3 light1Color : LIGHTCOLOR < + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Color"; + string UIWidget = "Color"; + int UIOrder = 33; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light1Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 34; +#endif +> = { 1.0f }; + +float3 light1Dir : DIRECTION < + string Object = "Light 1"; + string UIName = "Light 1 Direction"; + string Space = "World"; + int UIOrder = 35; + int RefID = 1; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light1ConeAngle : HOTSPOT // In radians +#else +float light1ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 36; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light1FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light1FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 37; +#endif +> = { 0.0f }; + +float light1AttenScale : DECAYRATE < + string Object = "Light 1"; + string UIName = "Light 1 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 38; +> = { 0.0 }; + +bool light1ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 39; +#endif +> = true; + +float4x4 light1Matrix : SHADOWMAPMATRIX < + string Object = "Light 1"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 2 GROUP +// --------------------------------------------- +bool light2Enable : LIGHTENABLE < + string Object = "Light 2"; + string UIName = "Enable Light 2"; + int UIOrder = 40; +> = false; + +int light2Type : LIGHTTYPE < + string Object = "Light 2"; + string UIName = "Light 2 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 41; +> = 2; + +float3 light2Pos : POSITION < + string Object = "Light 2"; + string UIName = "Light 2 Position"; + string Space = "World"; + int UIOrder = 42; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, -100.0f }; + +float3 light2Color : LIGHTCOLOR < + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Color"; + string UIWidget = "Color"; + int UIOrder = 43; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light2Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 44; +#endif +> = { 1.0f }; + +float3 light2Dir : DIRECTION < + string Object = "Light 2"; + string UIName = "Light 2 Direction"; + string Space = "World"; + int UIOrder = 45; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light2ConeAngle : HOTSPOT // In radians +#else +float light2ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 46; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light2FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light2FallOff : LIGHTFALLOFF +#endif +< +string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 47; +#endif +> = { 0.0f }; + +float light2AttenScale : DECAYRATE < + string Object = "Light 2"; + string UIName = "Light 2 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 48; +> = { 0.0 }; + +bool light2ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 49; +#endif +> = true; + +float4x4 light2Matrix : SHADOWMAPMATRIX < + string Object = "Light 2"; + string UIWidget = "None"; +>; + +} //end lights cbuffer + +//------------------------------------ +// Structs +//------------------------------------ +struct APPDATA { + float3 position : POSITION; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 normal : NORMAL; + float3 binormal : BINORMAL; + float3 tangent : TANGENT; +}; + +struct SHADERDATA { + float4 position : SV_Position; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 worldNormal : NORMAL; + float4 worldTangent : TANGENT; + float3 worldPosition : TEXCOORD3; + float4 screenCoord : TEXCOORD14; + +#ifdef _SUPPORTTESSELLATION_ + // Geometry generated control points: + // .worldPosition is CP0, so we don't need to store it again + float3 CP1 : TEXCOORD4; + float3 CP2 : TEXCOORD5; + + // PN-AEN with displacement fix: + float4 dominantEdge : TEXCOORD6; // both vertices of an edge + float2 dominantVertex : TEXCOORD7; // corner + + // Dominant normal and tangent for VDM crack fix: + // this could be compacted into less texcoords, but left as-is for readability + float3 dominantNormalE0 : TEXCOORD8; + float3 dominantNormalE1 : TEXCOORD9; + float3 dominantNormalCorner : TEXCOORD10; + + float3 dominantTangentE0 : TEXCOORD11; + float3 dominantTangentE1 : TEXCOORD12; + float3 dominantTangentCorner : TEXCOORD13; + + float clipped : CLIPPED; +#endif +}; + + +#ifdef _SUPPORTTESSELLATION_ +struct HSCONSTANTDATA { + float TessFactor[3] : SV_TessFactor; // tessellation amount for each edge of patch + float InsideTessFactor : SV_InsideTessFactor; // tessellation amount within a patch surface (would be float2 for quads) + float3 CPCenter : CENTER; // Geometry generated center control point +}; +#endif + +//------------------------------------ +// BRDF +//------------------------------------ + +float sqr(float x) { + return x*x; +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float D_Beckmann(float Roughness, float NoH) { + float m = Roughness; + float m2 = m * m; + + float NdotH2 = sqr(NoH); + return exp((NdotH2 - 1) / (m2 * NdotH2)) / (PI * m2 * NdotH2 * NdotH2); +} + +// This function is from Nvidia's Human Head demo +float D_BeckmannNVIDIA(float m, float ndoth) { + float alpha = acos(ndoth); + float ta = tan(alpha); + float val = 1.0 / (m*m*pow(ndoth, 4.0)) * exp(-(ta*ta) / (m*m)); + return val; +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_Schlick(float3 SpecularColor, float LdotH) { + return SpecularColor + (1.0f - SpecularColor) * exp2((-5.55473 * LdotH - 6.98316) * LdotH); +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2011, "Adopting a physically based shading model" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_LagardeSchlick(float3 SpecularColor, float Roughness, float NdotV) { + return SpecularColor + (max(1 - Roughness, SpecularColor) - SpecularColor) * exp2((-5.55473 * NdotV - 6.98316) * NdotV); +} + +float3 F_KelemenSzirmaykalos(float3 H, float3 V, float3 F0) { + float base = 1.0 - dot(V, H); + float exponential = pow(base, 5.0); + return exponential + F0 * (1.0 - exponential); +} + +float3 KelemenSzirmaykalos(float3 N, float3 L, float3 V, float roughness, float3 specular) { + float3 result = float3(0.0, 0.0, 0.0); + float NdotL = dot(N, L); + + if (NdotL > 0.0) { + float3 h = L + V; + float3 H = normalize(h); + float NdotH = dot(N, H); + float VdotH = dot(V, H); + float D = D_BeckmannNVIDIA(roughness, NdotH); + float3 F = F_Schlick(specular, VdotH); + float G = 1; + float3 specularDirect = max(D * G * F / dot(h, h), 0); + result = specularDirect * NdotL; // Specular is added for more tuning + } + return result; +} + +float3 PennerSkin(float3 skinCoef, float3 N, float3 L, float3 Nlow, float Curvature) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + pennerNdotL = saturate(pennerNdotL * 0.5 + 0.5); + + float3 pennerlookUp; + pennerlookUp.r = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.r, Curvature)).r; + pennerlookUp.g = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.g, Curvature)).g; + pennerlookUp.b = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.b, Curvature)).b; + + return pennerlookUp; +} + +float3 PennerSkinNoLUT(float3 skinCoef, float3 N, float3 L, float3 Nlow) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + + float3 pennerlookUp; + pennerlookUp.r = saturate(pennerNdotL.r*(float3(1, 1, 1).r - skinCoef.r) + skinCoef.r) * (1 - skinCoef.r); + pennerlookUp.g = saturate(pennerNdotL.g*(float3(1, 1, 1).g - skinCoef.g) + skinCoef.g) * (1 - skinCoef.g); + pennerlookUp.b = saturate(pennerNdotL.b*(float3(1, 1, 1).b - skinCoef.b) + skinCoef.b) * (1 - skinCoef.b); + + return pennerlookUp; +} + +float3 diffuseSkinIBL(float3 skinCoef, float3 diffuseIBL_HighFreq, float3 diffuseIBL_LowFreq) { + return lerp(diffuseIBL_HighFreq, diffuseIBL_LowFreq, skinCoef); +} + +//------------------------------------ +// Functions +//------------------------------------ + +float4 ComputeScreenPos(float4 pos) { +#if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; +#else + float scale = 1.0; +#endif + + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*scale) + o.w; + o.zw = pos.zw; + + return o; +} + +// Occlusion taking into account the color of the texture multiplied to it +float3 coloredOcclusion(float3 color, float occlusion) { + float3 coloredOcclusion = lerp(float3(1.0f, 1.0f, 1.0f), color, (1 - occlusion)); + //color *= coloredOcclusion; + return coloredOcclusion; +} + +float specularOcclusion(float3 N, float3 V, float Occlusion) { + const float specularPow = 5.0; + float NdotV = dot(N, V); + float s = saturate(-0.3 + NdotV * NdotV); + + return lerp(pow(Occlusion, specularPow), 1.0, s); +} + +float2 pickTexcoord(int index, float2 t0, float2 t1, float2 t2) { + float2 tcoord = t0; + + if (index == 1) { + tcoord = t1; + } else if (index == 2) { + tcoord = t2; + } + + return tcoord; +} + +float3 RotateVectorYaw(float3 vec, float degreeOfRotation) { + float3 rotatedVec = vec; + float angle = radians(degreeOfRotation); + + rotatedVec.x = (cos(angle) * vec.x) - (sin(angle) * vec.z); + rotatedVec.z = (sin(angle) * vec.x) + (cos(angle) * vec.z); + + return rotatedVec; +} + +// Spot light cone +float lightConeangle(float coneAngle, float coneFalloff, float3 lightVec, float3 lightDir) { + // the cone falloff should be equal or bigger then the coneAngle or the light inverts + // this is added to make manually tweaking the spot settings easier. + if (coneFalloff < coneAngle) { + coneFalloff = coneAngle; + } + + float LdotDir = dot(normalize(lightVec), lightDir); + + // cheaper cone, no fall-off control would be: + // float cone = pow(saturate(LdotDir), 1 / coneAngle); + + // higher quality cone (more expensive): + float cone = smoothstep(cos(coneFalloff), cos(coneAngle), LdotDir); + + return cone; +} + +#define SHADOW_FILTER_TAPS_CNT 10 + +float2 SuperFilterTaps[SHADOW_FILTER_TAPS_CNT] < string UIWidget = "None"; > = { + { -0.84052f, -0.073954f }, + { -0.326235f, -0.40583f }, + { -0.698464f, 0.457259f }, + { -0.203356f, 0.6205847f }, + { 0.96345f, -0.194353f }, + { 0.473434f, -0.480026f }, + { 0.519454f, 0.767034f }, + { 0.185461f, -0.8945231f }, + { 0.507351f, 0.064963f }, + { -0.321932f, 0.5954349f } +}; + +static float4 kernel[25] = { + { 0.530605, 0.613514, 0.739601, 0 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, -3 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, -2.52083 }, + { 0.00500364, 0.00020094, 5.28848e-005, -2.08333 }, + { 0.00700976, 0.00049366, 0.000151938, -1.6875 }, + { 0.0094389, 0.00139119, 0.000416598, -1.33333 }, + { 0.0128496, 0.00356329, 0.00132016, -1.02083 }, + { 0.017924, 0.00711691, 0.00347194, -0.75 }, + { 0.0263642, 0.0119715, 0.00684598, -0.520833 }, + { 0.0410172, 0.0199899, 0.0118481, -0.333333 }, + { 0.0493588, 0.0367726, 0.0219485, -0.1875 }, + { 0.0402784, 0.0657244, 0.04631, -0.0833333 }, + { 0.0211412, 0.0459286, 0.0378196, -0.0208333 }, + { 0.0211412, 0.0459286, 0.0378196, 0.0208333 }, + { 0.0402784, 0.0657244, 0.04631, 0.0833333 }, + { 0.0493588, 0.0367726, 0.0219485, 0.1875 }, + { 0.0410172, 0.0199899, 0.0118481, 0.333333 }, + { 0.0263642, 0.0119715, 0.00684598, 0.520833 }, + { 0.017924, 0.00711691, 0.00347194, 0.75 }, + { 0.0128496, 0.00356329, 0.00132016, 1.02083 }, + { 0.0094389, 0.00139119, 0.000416598, 1.33333 }, + { 0.00700976, 0.00049366, 0.000151938, 1.6875 }, + { 0.00500364, 0.00020094, 5.28848e-005, 2.08333 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, 2.52083 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, 3 } +}; + + +static float2 kernelRandom[32] = { + { 0.254395, 0.385445 }, + { -0.139177, 0.571074 }, + { -0.453510, 0.962140 }, + { 0.482684, 0.346190 }, + { 0.889741, 0.724799 }, + { -0.661047, -0.137344 }, + { -0.193311, -0.313475 }, + { 0.363177, -0.960291 }, + { -0.225866, -0.654962 }, + { 0.407875, 0.431522 }, + { -0.543008, -0.992827 }, + { -0.878493, -0.896999 }, + { -0.641776, 0.130757 }, + { -0.785279, -0.015190 }, + { 0.469054, 0.248633 }, + { -0.820410, -0.562833 }, + { 0.174019, -0.618069 }, + { -0.906449, -0.275099 }, + { -0.655285, -0.956021 }, + { 0.453776, -0.085425 }, + { -0.430788, -0.089530 }, + { -0.587370, -0.851826 }, + { 0.149056, -0.474322 }, + { 0.228684, 0.321661 }, + { -0.668752, -0.829400 }, + { -0.729554, 0.438250 }, + { -0.467018, -0.252882 }, + { 0.090398, 0.618760 }, + { 0.741840, 0.516401 }, + { -0.983891, 0.248701 }, + { -0.162010, -0.714455 }, + { 0.308825, 0.787175 } +}; + +float shadowMapTexelSize < string UIWidget = "None"; > = { 0.00195313 }; // (1.0f / 512) + +// Shadows: +// Percentage-Closer Filtering +float3 lightShadow(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size) { + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float shadowColored = 0; + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + float z = Pndc.z - shadowDepthBias / Pndc.w; + + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 32; ++i) { + float2 offset = kernelRandom[i] * shadowDepth * shadowMapTexelSize; + float2 ditherOffset = mul(offset, rotationMatrix); + ditherOffset = lerp(offset, ditherOffset, shadowDither); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + ditherOffset, 0).x; + + ditherShadow += (sample >= 0.0f) ? 0.0f : (1.0f / 32); + } + } + + return ditherShadow; +} + +float3 lightShadowSkin(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size, float2 dir) { + + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float3 shadowColored = float3(0, 0, 0); + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + + float z = Pndc.z - shadowDepthBias / Pndc.w; + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 25; ++i) { + float2 offset = kernel[i].a * dir * shadowDepth * shadowMapTexelSize; + offset = mul(offset, rotationMatrix); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + offset, 0).x; + ditherShadow = (sample >= 0.0f) ? 0.0f : 1.0f; + + shadowColored += ditherShadow * kernel[i].rgb; + } + } + + return shadowColored; +} + +#ifdef _SUPPORTTESSELLATION_ +// Pick dominant for crack free displacement (original function by Bryan Dudash, modified to support any float3) +float3 PickDominant(float3 vec, // vector to change + float U, float V, float W, // barycoords + float3 DE0A, float3 DE0B, // domimant edge 0 vertex A and B + float3 DE1A, float3 DE1B, // domimant edge 1 vertex A and B + float3 DE2A, float3 DE2B, // domimant edge 2 vertex A and B + float3 DV0, float3 DV1, float3 DV2) { // dominant corners + // Override the texture coordinates along the primitive edges and at the corners. + // Keep the original interpolated coords for the inner area of the primitive. + + float3 dominantVector = vec; + + float edgeThreshold = 0.0001f; + float edgeU = (U == 0) ? 1 : 0; + float edgeV = (V == 0) ? 1 : 0; + float edgeW = (W == 0) ? 1 : 0; + + float corner = ((edgeU + edgeV + edgeW) == 2) ? 1 : 0; // two are 0, means we are a corner + float edge = ((edgeU + edgeV + edgeW) == 1) ? 1 : 0; // one of them is 0, means we are an edge + float innerarea = ((edgeU + edgeV + edgeW) == 0) ? 1 : 0; // none are 0, means we are interior + + if (innerarea != 1) { + // Note: the order of the vertices/edges we choose here can be different per application + // and depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + if (corner) { + if (U > 1.0 - edgeThreshold) + dominantVector = DV1; + else if (V > 1.0 - edgeThreshold) + dominantVector = DV2; + else if (W > 1.0 - edgeThreshold) + dominantVector = DV0; + } else { + if (edgeU) + dominantVector = lerp(DE2A, DE2B, W); + else if (edgeV) + dominantVector = lerp(DE0A, DE0B, U); + else + dominantVector = lerp(DE1A, DE1B, V); + } + } + + return dominantVector; +} + +// outside of view? +float IsClipped(float4 clipPos) { + float W = clipPos.w + DisplacementClippingBias; // bias allows artist to control to early clipping due to displacement + // Test whether the position is entirely inside the view frustum. + return (-W <= clipPos.x && clipPos.x <= W && -W <= clipPos.y && clipPos.y <= W && -W <= clipPos.z && clipPos.z <= W) ? 0.0f : 1.0f; +} + +// Compute whether all three control points along the edge are outside of the view frustum. +// By doing this, we're ensuring that +// 1.0 means clipped, 0.0 means unclipped. +float ComputeClipping(float3 cpA, float3 cpB, float3 cpC) { + // Compute the projected position for each position, then check to see whether they are clipped. + float4 projPosA = mul(float4(cpA, 1), viewPrj), projPosB = mul(float4(cpB, 1), viewPrj), projPosC = mul(float4(cpC, 1), viewPrj); + return min(min(IsClipped(projPosA), IsClipped(projPosB)), IsClipped(projPosC)); +} + +// PN Triangles and PN-AEN control points: +float3 ComputeCP(float3 posA, float3 posB, float3 normA) { + return (2.0f * posA + posB - (dot((posB - posA), normA) * normA)) / 3.0f; +} +#endif + +// Clip pixel away when opacity mask is used +void OpacityMaskClip(float2 uv) { + if (UseOpacityMaskTexture) { + float OpacityMaskMap = OpacityMaskTexture.Sample(SamplerAnisoWrap, uv).x; + + // clip value when less then 0 for punch-through alpha. + clip(OpacityMaskMap < OpacityMaskBias ? -1 : 1); + } +} + + +// Calculate a light: +struct lightOut { + float Specular; + float3 Color; +}; + +lightOut CalculateLight(bool lightEnable, int lightType, float lightAtten, float3 lightPos, float3 vertWorldPos, + float3 lightColor, float lightIntensity, float3 lightDir, float lightConeAngle, float lightFallOff, float4x4 lightViewPrjMatrix, + uniform Texture2D lightShadowMap, bool lightShadowOn, float3 vertexNormal, float3 normal, float3 diffuseColorIn, + float3 eyeVec, float roughness, float3 specularColorIn, float3 thickness, float softenMask, + float gammaCorrection, float opacity, float3 ambientOcclusion, float3 skinOcclusion, float2 screenCoord, float2 size, float scatteringRadius) { + lightOut OUT = (lightOut)0; + + OUT.Specular = 0.0; + OUT.Color = float3(0, 0, 0); + + if (lightEnable) { + // For Maya, flip the lightDir: +#ifdef _MAYA_ + lightDir = -lightDir; +#endif + + bool isAmbientLight = (lightType == 5); + if (isAmbientLight) { + OUT.Color = diffuseColorIn * lightColor * lightIntensity; + OUT.Color.rgb *= ambientOcclusion; + return OUT; + } + + bool isDirectionalLight = (lightType == 4); + float3 lightVec = lerp(lightPos - vertWorldPos, lightDir, isDirectionalLight); + + float3 L = normalize(lightVec); + + // Diffuse: + float3 diffuseDirect = float3(0, 0, 0); + float3 scatter = float3(skinCoeffX, skinCoeffY, skinCoeffZ); + diffuseDirect = PennerSkin(scatter, normal, L, vertexNormal, 1 - (scatteringRadius*skinScattering)) * diffuseColorIn; + //diffuseDirect = PennerSkinNoLUT(scatter,normal,L, vertexNormal) * diffuseColorIn; + + // Specular: + float3 specularDirect = float3(0, 0, 0); + + float3 Lobe1 = KelemenSzirmaykalos(normal, L, eyeVec, roughness, specularColorIn); + float3 Lobe2 = KelemenSzirmaykalos(normal, L, eyeVec, roughness*0.5, specularColorIn); + + specularDirect = Lobe2 * LobeMix + Lobe1 * (1 - LobeMix); + + // Light Attenuation: + bool enableAttenuation = lightAtten > 0.0001f; + float attenuation = 1.0f; + if (!isDirectionalLight) { + attenuation = lerp(1.0, 1 / pow(length(lightVec), lightAtten), enableAttenuation); + } + + // Spot light Cone Angle: + float angle = 1; + if (lightType == 2) { + angle = lightConeangle(lightConeAngle, lightFallOff, lightVec, lightDir); + } + + // Shadows: + float shadow = 1; + float3 skinShadow = float3(1, 1, 1); + float3 softShadow = float3(1, 1, 1); + if (UseShadows && lightShadowOn) { + shadow = lightShadow(lightViewPrjMatrix, lightShadowMap, vertWorldPos, screenCoord, shadowBlur, size); + + skinShadow = LutTexture.Sample(SamplerAnisoClamp, float2(shadow * angle, 1 - shadowScattering)); + skinShadow = lerp(dot(float3(0.33, 0.59, 0.11), skinShadow), skinShadow, shadowSaturation); + skinShadow = lerp(skinShadow, 1, (shadow* angle)*(shadow* angle)*(shadow* angle)); + } + + float3 lightAttenuation = lightIntensity * angle * attenuation * lightColor; + + diffuseDirect *= lightIntensity * skinShadow * attenuation * lightColor; + specularDirect *= lightAttenuation * shadow; + + float3 backScattering = float3(0, 0, 0); + if (UseTranslucency) { + half backRoughness = (1 - skinScatteringRoughness) * 128; + float3 viewScattering = exp2(saturate(dot(eyeVec, -(L + (normal * 0.01)))) * backRoughness - backRoughness) * skinScatteringAmount; + float3 lightScattering = saturate(dot(-L, normal)*0.5 + 0.5) * skinAmbientScatteringAmount; + + //float3 IBLScattering = diffuseIBL; + backScattering = (viewScattering + lightScattering) * lightAttenuation * shadow * thickness; + + float3 profile = skinScatteringOuterColor * backScattering; + backScattering = profile * skinScatteringAmount; + + + /*float scale = 2e4 * (1.0 - skinScatteringAmount) / backRoughness; + + float4 shrinkedPos = float4(vertWorldPos - 0.005 * vertexNormal, 1.0); + + float4 shadowPosition = mul(shrinkedPos, lightViewPrjMatrix); + + float d1 = lightShadowMap.Sample(SamplerShadowDepth, shadowPosition.xy / shadowPosition.w); // 'd1' has a range of 0..1 + + float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane' + d1 *= skinScatteringPlane*shadowPosition.w; // So we scale 'd1' accordingly: + float d = scale * abs(d1 - d2); + + float dd = -d * d; + float3 profile = float3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + float3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + float3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + float3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + float3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + float3(0.078, 0.0, 0.0) * exp(dd / 7.41); + backScattering = profile * saturate((0.3 + dot(L, -vertexNormal)) / 1.3) * thickness * diffuseColorIn; */ + } + + OUT.Color += diffuseDirect * skinOcclusion; + OUT.Color *= opacity; + OUT.Color += specularDirect * ambientOcclusion + backScattering; + + // Output specular and rim for opacity: + // OUT.Specular = dot(saturate(specularColor), float3(0.3f, 0.6f, 0.1f)); + } // end if light enabled + + return OUT; +} + +//------------------------------------ +// vertex shader with tessellation +//------------------------------------ +// take inputs from 3d-app +// vertex animation/skinning would happen here +SHADERDATA vt(APPDATA IN) { + SHADERDATA OUT = (SHADERDATA)0; + + // we pass vertices in world space + float4 worldPos = mul(float4(IN.position, 1), world); + OUT.worldPosition.xyz = worldPos.xyz; + +#ifdef _SUPPORTTESSELLATION_ + OUT.position = worldPos; +#else + OUT.position = float4(IN.position.xyz, 1); +#endif + + OUT.screenCoord = mul(float4(OUT.position.xyz, 1), viewPrj); + + // Pass through texture coordinates + // flip Y for Maya +#ifdef _MAYA_ + OUT.texCoord0 = float2(IN.texCoord0.x, (1.0 - IN.texCoord0.y)); + OUT.texCoord1 = float2(IN.texCoord1.x, (1.0 - IN.texCoord1.y)); + OUT.texCoord2 = float2(IN.texCoord2.x, (1.0 - IN.texCoord2.y)); +#else + OUT.texCoord0 = IN.texCoord0; + OUT.texCoord1 = IN.texCoord1; + OUT.texCoord2 = IN.texCoord2; +#endif + + // output normals in world space: + if (!SupportNonUniformScale) { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)world)); + } else { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)worldIT)); + } + + // output tangent in world space: + if (!SupportNonUniformScale) { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)world)); + } else { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)worldIT)); + } + + // store direction for normal map: + OUT.worldTangent.w = 1; + if (dot(cross(IN.normal.xyz, IN.tangent.xyz), IN.binormal.xyz) < 0.0) { + OUT.worldTangent.w = -1; + } + + return OUT; +} + + +//------------------------------------ +// vertex shader without tessellation +//------------------------------------ +SHADERDATA v(APPDATA IN) { + SHADERDATA OUT = vt(IN); + + // If we don't use tessellation, pass vertices in clip space: +#ifdef _SUPPORTTESSELLATION_ + OUT.position = mul(float4(OUT.position.xyz, 1), viewPrj); +#else + OUT.position = mul(float4(IN.position, 1), wvp); +#endif + + return OUT; +} + +#ifdef _SUPPORTTESSELLATION_ +//------------------------------------ +// hull shader +//------------------------------------ +// executed once per control point. +// control points can be considered the original vertices of the mesh +// outputs a control point +// run parallel with hull constant function +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_cw")] +[patchconstantfunc("HS_Constant")] +[outputcontrolpoints(3)] +[maxtessfactor(64.0)] + +// PN-AEN without displacement fix: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + +// PN Triangles, no crack fixes: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + + +// PN-AEN and displacement fix +// the index buffer is made up as follows: +// the triangle vertices index (int3) // PNAEN9 and PNAEN18 +// the 3 adjacent edges vertices index (3 * int2) // PNAEN9 and PNAEN18 +// the 3 dominant edges vertices index (3 * int2) // PNAEN18 +// the dominant position vertices index (int3) // PNAEN18 +SHADERDATA HS(InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID) { + SHADERDATA OUT = (SHADERDATA)0; + + // copy everything first: + OUT = IN[index]; + + // Compute the next output control point ID so we know which edge we're on. + const uint nextIndex = index < 2 ? index + 1 : 0; // (index + 1) % 3 + + // PN-AEN 9 and 18: + const uint neighborIndex = 3 + 2 * index; + const uint neighborNextIndex = neighborIndex + 1; + float3 myCP, neighborCP; + + // Calculate original PN control points and neighbors'. Then average. + myCP = ComputeCP(IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + neighborCP = ComputeCP(IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldNormal); + OUT.CP1 = (myCP + neighborCP) / 2; + + myCP = ComputeCP(IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + neighborCP = ComputeCP(IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldNormal); + OUT.CP2 = (myCP + neighborCP) / 2; + + // PN Triangles only would be: + // OUT.CP1 = ComputeCP( IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + // OUT.CP2 = ComputeCP( IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + + // Clipping: + OUT.clipped = ComputeClipping(OUT.worldPosition, OUT.CP1, OUT.CP2); + + // PN-AEN discontinuity code for displacement UVs: + const uint dominantEdgeIndex = 9 + 2 * index; + const uint dominantEdgeNextIndex = dominantEdgeIndex + 1; + const uint dominantVertexIndex = 15 + index; + + // Note: the order of the vertices/edges we choose here can be different per application and + // depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + float2 dominantEdgeUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeIndex].texCoord0, IN[dominantEdgeIndex].texCoord1, IN[dominantEdgeIndex].texCoord2); + float2 dominantEdgeNextUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeNextIndex].texCoord0, IN[dominantEdgeNextIndex].texCoord1, IN[dominantEdgeNextIndex].texCoord2); + float2 dominantVertexUV = pickTexcoord(DisplacementTexcoord, IN[dominantVertexIndex].texCoord0, IN[dominantVertexIndex].texCoord1, IN[dominantVertexIndex].texCoord2); + + OUT.dominantEdge = float4(dominantEdgeNextUV, dominantEdgeUV); + OUT.dominantVertex = dominantVertexUV; + + // VDM dominant normal and tangent for displacement crack fix: + OUT.dominantNormalE0 = IN[dominantEdgeNextIndex].worldNormal.xyz; + OUT.dominantNormalE1 = IN[dominantEdgeIndex].worldNormal.xyz; + OUT.dominantNormalCorner = IN[dominantVertexIndex].worldNormal.xyz; + + OUT.dominantTangentE0 = IN[dominantEdgeNextIndex].worldTangent.xyz; + OUT.dominantTangentE1 = IN[dominantEdgeIndex].worldTangent.xyz; + OUT.dominantTangentCorner = IN[dominantVertexIndex].worldTangent.xyz; + + return OUT; +} + +//------------------------------------ +// Hull shader constant function +//------------------------------------ +// executed once per patch +// outputs user defined data per patch and tessellation factor +// calculates control points for vertex and normal and passes to domain +// This hull shader passes the tessellation factors through to the HW tessellator, +// run parallel with hull function +HSCONSTANTDATA HS_Constant(const OutputPatch IN, uint patchID : SV_PrimitiveID) { + HSCONSTANTDATA OUT = (HSCONSTANTDATA)0; + + // future todo: + // triangle is on silhouette? + // triangle is facing camera? If facing backwards, reduce tessellation + // triangle lies in high frequency area of displacement map (density-based tessellation)? + + // Now setup the PNTriangle control points... + // Center control point + float3 f3E = (IN[0].CP1 + IN[0].CP2 + IN[1].CP1 + IN[1].CP2 + IN[2].CP1 + IN[2].CP2) / 6.0f; + float3 f3V = (IN[0].worldPosition + IN[1].worldPosition + IN[2].worldPosition) / 3.0f; + OUT.CPCenter = f3E + ((f3E - f3V) / 2.0f); + + // Clipping: + float4 centerViewPos = mul(float4(OUT.CPCenter, 1), viewPrj); + bool centerClipped = IsClipped(centerViewPos); + + if (IN[0].clipped && IN[1].clipped && IN[2].clipped && centerClipped) { + // If all control points are clipped, the surface cannot possibly be visible. + // Not entirely true, because displacement mapping can make them visible in the domain shader + // so we provide the user with a bias factor to avoid clipping too early + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = 0; + } else { + // Camera based tessellation, per object. So very basic. + float3 CameraPosition = viewInv[3].xyz; + float LengthOp = length((CameraPosition - world[3].xyz)); + float DivOp = (TessellationRange / LengthOp); + float MaxOp = max(TessellationMin + DivOp, 1); + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = MaxOp; + } + + // Inside tess factor is just the average of the edge factors + OUT.InsideTessFactor = (OUT.TessFactor[0] + OUT.TessFactor[1] + OUT.TessFactor[2]) / 3.0f; + + return OUT; +} + +//------------------------------------ +// domain shader +//------------------------------------ +// outputs the new vertices based on previous tessellation. +// also calculates new normals and uvs +// This domain shader applies contol point weighting to the barycentric coords produced by the FF tessellator +// If you wanted to do any vertex lighting, it would have to happen here. +[domain("tri")] +SHADERDATA DS(HSCONSTANTDATA HSIN, OutputPatch IN, float3 f3BarycentricCoords : SV_DomainLocation) { + SHADERDATA OUT = (SHADERDATA)0; + + // The barycentric coordinates + float fU = f3BarycentricCoords.x; + float fV = f3BarycentricCoords.y; + float fW = f3BarycentricCoords.z; + + // Precompute squares and squares * 3 + float fUU = fU * fU; + float fVV = fV * fV; + float fWW = fW * fW; + float fUU3 = fUU * 3.0f; + float fVV3 = fVV * 3.0f; + float fWW3 = fWW * 3.0f; + + // PN position: + float3 position = IN[0].worldPosition * fWW * fW + + IN[1].worldPosition * fUU * fU + + IN[2].worldPosition * fVV * fV + + IN[0].CP1 * fWW3 * fU + + IN[0].CP2 * fW * fUU3 + + IN[2].CP2 * fWW3 * fV + + IN[1].CP1 * fUU3 * fV + + IN[2].CP1 * fW * fVV3 + + IN[1].CP2 * fU * fVV3 + + HSIN.CPCenter * 6.0f * fW * fU * fV; + + // Flat position: + float3 flatPosition = IN[0].worldPosition * fW + IN[1].worldPosition * fU + IN[2].worldPosition * fV; + + // allow user to blend between PN tessellation and flat tessellation: + position = lerp(position, flatPosition, FlatTessellation); + + // Interpolate normal + float3 normal = IN[0].worldNormal * fW + IN[1].worldNormal * fU + IN[2].worldNormal * fV; + + // Normalize the interpolated normal + OUT.worldNormal = normalize(normal); + + // Compute tangent: + float3 tangent = IN[0].worldTangent.xyz * fW + IN[1].worldTangent.xyz * fU + IN[2].worldTangent.xyz * fV; + OUT.worldTangent.xyz = normalize(tangent.xyz); + + // Pass through the direction of the binormal as calculated in the vertex shader + OUT.worldTangent.w = IN[0].worldTangent.w; + + // Linear interpolate the texture coords + OUT.texCoord0 = IN[0].texCoord0 * fW + IN[1].texCoord0 * fU + IN[2].texCoord0 * fV; + OUT.texCoord1 = IN[0].texCoord1 * fW + IN[1].texCoord1 * fU + IN[2].texCoord1 * fV; + OUT.texCoord2 = IN[0].texCoord2 * fW + IN[1].texCoord2 * fU + IN[2].texCoord2 * fV; + + // apply displacement map (only when not rendering the Maya preview swatch): + if (UseDisplacementMap && !IsSwatchRender) { + // Fix Displacement Seams. + // we assume here that the displacement UVs is UVset 0. + // if this UVset index is changed, it should als be changed in the hull shader + // PN-AEN 18 with displacement UV seam fix + float2 displaceUV = pickTexcoord(DisplacementTexcoord, OUT.texCoord0, OUT.texCoord1, OUT.texCoord2); + float3 displacementUVW = PickDominant(float3(displaceUV, 0), fU, fV, fW, + float3(IN[0].dominantEdge.xy, 0), float3(IN[0].dominantEdge.zw, 0), + float3(IN[1].dominantEdge.xy, 0), float3(IN[1].dominantEdge.zw, 0), + float3(IN[2].dominantEdge.xy, 0), float3(IN[2].dominantEdge.zw, 0), + float3(IN[0].dominantVertex.xy, 0), + float3(IN[1].dominantVertex.xy, 0), + float3(IN[2].dominantVertex.xy, 0)); + + // We can still get cracks here because the world tangent and normal may be different for vertices on each side of the UV seam, + // because we do the tangent to world conversion, we get the same diplacement amount, but it results in different movement once converted to world space. + // And even a tiny difference between normal or tangent will cause large cracks. + float3 displacementNormal = PickDominant(OUT.worldNormal, + fU, fV, fW, + IN[0].dominantNormalE0, IN[0].dominantNormalE1, + IN[1].dominantNormalE0, IN[1].dominantNormalE1, + IN[2].dominantNormalE0, IN[2].dominantNormalE1, + IN[0].dominantNormalCorner, + IN[1].dominantNormalCorner, + IN[2].dominantNormalCorner); + + displacementNormal = normalize(displacementNormal); + + if (DisplacementModel == 1) { // Tangent Vector Displacement + float3 displacementTangent = PickDominant(OUT.worldTangent.xyz, fU, fV, fW, + IN[0].dominantTangentE0, IN[0].dominantTangentE1, + IN[1].dominantTangentE0, IN[1].dominantTangentE1, + IN[2].dominantTangentE0, IN[2].dominantTangentE1, + IN[0].dominantTangentCorner, + IN[1].dominantTangentCorner, + IN[2].dominantTangentCorner); + + displacementTangent = normalize(displacementTangent); + + float3 vecDisp = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).xyz; + vecDisp -= DisplacementOffset; + + float3 Bn = cross(displacementNormal, displacementTangent); + float3x3 toWorld = float3x3(displacementTangent, Bn.xyz, displacementNormal); + + float3 VDMcoordSys = vecDisp.xzy; // Mudbox + if (VectorDisplacementCoordSys == 1) { + VDMcoordSys = vecDisp.xyz; // Maya or ZBrush + } + + float3 vecDispW = mul(VDMcoordSys, toWorld) * DisplacementHeight; + position.xyz += vecDispW; + } else { + // offset (-0.5) so that we can have negative displacement also + float offset = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).x - DisplacementOffset; + position.xyz += displacementNormal * offset * DisplacementHeight; + } + } + + // Update World Position value for inside pixel shader: + OUT.worldPosition = position.xyz; + + // Transform model position with view-projection matrix + //OUT.position = float4(position.xyz, 1); // with geo + OUT.position = mul(float4(position.xyz, 1), viewPrj); // without geo + + return OUT; +} + +//------------------------------------ +// Geometry Shader +//------------------------------------ +// This is a sample Geo shader. Disabled in this shader, but left here for your reference. +// If you wish to enable it, search for 'with geo' in this shader for code to change. +[maxvertexcount(3)] // Declaration for the maximum number of vertices to create +void GS(triangle SHADERDATA IN[3], inout TriangleStream TriStream) { + SHADERDATA OUT; + + // quick test to see if geo also works: + for (int i = 0; i<3; ++i) { + OUT = IN[i]; + OUT.position = mul(mul(float4(OUT.position.xyz, 1), view), prj); + TriStream.Append(OUT); + } + TriStream.RestartStrip(); // end triangle +} +#endif + +void sampleMasks() { + +} + +//------------------------------------ +// pixel shader +//------------------------------------ +float4 f(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) : SV_Target { +#ifdef _3DSMAX_ + FrontFace = !FrontFace; +#endif + // clip are early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float gammaCorrection = lerp(1.0, 2.2, LinearSpaceLighting); + + float3 N = normalize(IN.worldNormal.xyz); + if (flipBackfaceNormals) { + N = lerp(-N, N, FrontFace); + } + float3 Nw = N; + + // Tangent and BiNormal: + float3 T = normalize(IN.worldTangent.xyz); + float3 Bn = cross(N, T); + Bn *= IN.worldTangent.w; + + float4 diffuse = float4(1, 1, 1, 1); + if (UseDiffuseTexture) { + float2 diffuseUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 diffuseTextureSample = DiffuseTexture.Sample(SamplerAnisoWrap, diffuseUV); + + if (UseDiffuseTextureAlpha) { + diffuse.a = diffuseTextureSample.a; + } + + diffuse.rgb *= pow(diffuseTextureSample.rgb, gammaCorrection); + } + + float3 microNormal = float3(0, 0, 1); + if (UseNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(NormalTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 NormalMap = NormalTexture.Sample(SamplerAnisoWrap, normalUV).xyz * 2.0 - 1.0; + float3 backupNormal = NormalMap; + + if (NormalCoordsysX > 0) + NormalMap.x = -NormalMap.x; + if (NormalCoordsysY > 0) + NormalMap.y = -NormalMap.y; + + NormalMap.xy *= NormalHeight; + + if (UseMicroNormalTexture) { + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + NormalMap.xy += microNormal.xy; + } + + if (UseBlendTexture) { + float2 blendUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + + float3 animNormalSample_00 = animNormalMap_00.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_00.y = -animNormalSample_00.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_00.x = -animNormalSample_00.x; + } + float3 animNormalDelta_00 = animNormalSample_00 - NormalMap; + float3 animNormalSample_01 = animNormalMap_01.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_01.y = -animNormalSample_01.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_01.x = -animNormalSample_01.x; + } + float3 animNormalDelta_01 = animNormalSample_01 - NormalMap; + float3 animNormalSample_02 = animNormalMap_02.Sample(SamplerAnisoWrap, blendUV).xyz * 2.0 - 1.0; + if (NormalCoordsysY > 0) { + animNormalSample_02.y = -animNormalSample_02.y; + } + if (NormalCoordsysX > 0) { + animNormalSample_02.x = -animNormalSample_02.x; + } + float3 animNormalDelta_02 = animNormalSample_02 - NormalMap; + + float3 animColorDelta_00 = (pow(animColorMap_00.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + float3 animColorDelta_01 = (pow(animColorMap_01.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + float3 animColorDelta_02 = (pow(animColorMap_02.Sample(SamplerAnisoWrap, blendUV).xyz, gammaCorrection)) - diffuse; + + float maskChannelVal_00 = maskChannel_00.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_01 = maskChannel_01.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_02 = maskChannel_02.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_03 = maskChannel_03.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_04 = maskChannel_04.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_05 = maskChannel_05.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_06 = maskChannel_06.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_07 = maskChannel_07.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_08 = maskChannel_08.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_09 = maskChannel_09.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_10 = maskChannel_10.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_11 = maskChannel_11.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_12 = maskChannel_12.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_13 = maskChannel_13.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_14 = maskChannel_14.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_15 = maskChannel_15.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_16 = maskChannel_16.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_17 = maskChannel_17.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_18 = maskChannel_18.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_19 = maskChannel_19.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_20 = maskChannel_20.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_21 = maskChannel_21.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_22 = maskChannel_22.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_23 = maskChannel_23.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_24 = maskChannel_24.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_25 = maskChannel_25.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_26 = maskChannel_26.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_27 = maskChannel_27.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_28 = maskChannel_28.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_29 = maskChannel_29.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_30 = maskChannel_30.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_31 = maskChannel_31.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_32 = maskChannel_32.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_33 = maskChannel_33.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_34 = maskChannel_34.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_35 = maskChannel_35.Sample(SamplerAnisoWrap, blendUV); + float maskChannelVal_36 = maskChannel_36.Sample(SamplerAnisoWrap, blendUV); + + NormalMap.xy += animNormalDelta_00 * maskWeight_47 * maskChannelVal_36 + + animNormalDelta_00 * maskWeight_15 * maskChannelVal_05 + + animNormalDelta_00 * maskWeight_13 * maskChannelVal_04 + + animNormalDelta_00 * maskWeight_46 * maskChannelVal_35 + + animNormalDelta_00 * maskWeight_73 * maskChannelVal_06 + + animNormalDelta_00 * maskWeight_11 * maskChannelVal_03 + + animNormalDelta_00 * maskWeight_65 * maskChannelVal_11 + + animNormalDelta_00 * maskWeight_75 * maskChannelVal_07 + + animNormalDelta_00 * maskWeight_67 * maskChannelVal_12 + + animNormalDelta_00 * maskWeight_09 * maskChannelVal_02 + + animNormalDelta_00 * maskWeight_49 * maskChannelVal_34 + + animNormalDelta_00 * maskWeight_71 * maskChannelVal_10 + + animNormalDelta_00 * maskWeight_48 * maskChannelVal_33 + + animNormalDelta_00 * maskWeight_23 * maskChannelVal_14 + + animNormalDelta_00 * maskWeight_69 * maskChannelVal_09 + + animNormalDelta_00 * maskWeight_18 * maskChannelVal_00 + + animNormalDelta_00 * maskWeight_22 * maskChannelVal_01 + + animNormalDelta_00 * maskWeight_77 * maskChannelVal_08 + + animNormalDelta_00 * maskWeight_19 * maskChannelVal_13 + + animNormalDelta_01 * maskWeight_07 * maskChannelVal_18 + + animNormalDelta_01 * maskWeight_03 * maskChannelVal_16 + + animNormalDelta_01 * maskWeight_81 * maskChannelVal_22 + + animNormalDelta_01 * maskWeight_79 * maskChannelVal_21 + + animNormalDelta_01 * maskWeight_01 * maskChannelVal_15 + + animNormalDelta_01 * maskWeight_05 * maskChannelVal_17 + + animNormalDelta_01 * maskWeight_63 * maskChannelVal_20 + + animNormalDelta_01 * maskWeight_37 * maskChannelVal_23 + + animNormalDelta_01 * maskWeight_61 * maskChannelVal_19 + + animNormalDelta_01 * maskWeight_39 * maskChannelVal_24 + + animNormalDelta_02 * maskWeight_59 * maskChannelVal_34 + + animNormalDelta_02 * maskWeight_35 * maskChannelVal_30 + + animNormalDelta_02 * maskWeight_54 * maskChannelVal_35 + + animNormalDelta_02 * maskWeight_58 * maskChannelVal_36 + + animNormalDelta_02 * maskWeight_29 * maskChannelVal_29 + + animNormalDelta_02 * maskWeight_55 * maskChannelVal_33 + + animNormalDelta_02 * maskWeight_28 * maskChannelVal_27 + + animNormalDelta_02 * maskWeight_33 * maskChannelVal_26 + + animNormalDelta_02 * maskWeight_27 * maskChannelVal_25 + + animNormalDelta_02 * maskWeight_34 * maskChannelVal_28 + + animNormalDelta_02 * maskWeight_41 * maskChannelVal_31 + + animNormalDelta_02 * maskWeight_51 * maskChannelVal_32; + + diffuse.rgb += animColorDelta_00 * maskWeight_20 * maskChannelVal_01 + + animColorDelta_00 * maskWeight_70 * maskChannelVal_10 + + animColorDelta_00 * maskWeight_43 * maskChannelVal_36 + + animColorDelta_00 * maskWeight_66 * maskChannelVal_12 + + animColorDelta_00 * maskWeight_45 * maskChannelVal_34 + + animColorDelta_00 * maskWeight_12 * maskChannelVal_04 + + animColorDelta_00 * maskWeight_14 * maskChannelVal_05 + + animColorDelta_00 * maskWeight_44 * maskChannelVal_33 + + animColorDelta_00 * maskWeight_42 * maskChannelVal_35 + + animColorDelta_00 * maskWeight_16 * maskChannelVal_00 + + animColorDelta_00 * maskWeight_74 * maskChannelVal_07 + + animColorDelta_00 * maskWeight_64 * maskChannelVal_11 + + animColorDelta_00 * maskWeight_68 * maskChannelVal_09 + + animColorDelta_00 * maskWeight_10 * maskChannelVal_03 + + animColorDelta_00 * maskWeight_08 * maskChannelVal_02 + + animColorDelta_00 * maskWeight_72 * maskChannelVal_06 + + animColorDelta_00 * maskWeight_21 * maskChannelVal_14 + + animColorDelta_00 * maskWeight_76 * maskChannelVal_08 + + animColorDelta_00 * maskWeight_17 * maskChannelVal_13 + + animColorDelta_01 * maskWeight_78 * maskChannelVal_21 + + animColorDelta_01 * maskWeight_60 * maskChannelVal_19 + + animColorDelta_01 * maskWeight_80 * maskChannelVal_22 + + animColorDelta_01 * maskWeight_06 * maskChannelVal_18 + + animColorDelta_01 * maskWeight_04 * maskChannelVal_17 + + animColorDelta_01 * maskWeight_62 * maskChannelVal_20 + + animColorDelta_01 * maskWeight_38 * maskChannelVal_24 + + animColorDelta_01 * maskWeight_36 * maskChannelVal_23 + + animColorDelta_01 * maskWeight_02 * maskChannelVal_16 + + animColorDelta_01 * maskWeight_00 * maskChannelVal_15 + + animColorDelta_02 * maskWeight_30 * maskChannelVal_26 + + animColorDelta_02 * maskWeight_52 * maskChannelVal_35 + + animColorDelta_02 * maskWeight_32 * maskChannelVal_30 + + animColorDelta_02 * maskWeight_26 * maskChannelVal_29 + + animColorDelta_02 * maskWeight_24 * maskChannelVal_25 + + animColorDelta_02 * maskWeight_56 * maskChannelVal_36 + + animColorDelta_02 * maskWeight_25 * maskChannelVal_27 + + animColorDelta_02 * maskWeight_57 * maskChannelVal_34 + + animColorDelta_02 * maskWeight_53 * maskChannelVal_33 + + animColorDelta_02 * maskWeight_31 * maskChannelVal_28 + + animColorDelta_02 * maskWeight_50 * maskChannelVal_32 + + animColorDelta_02 * maskWeight_40 * maskChannelVal_31; + + } + NormalMap = mul(NormalMap.xyz, toWorld); + N = normalize(NormalMap); + } else { + if (UseMicroNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + microNormal = mul(microNormal.xyz, toWorld); + } + } + + diffuse.rgb *= DiffuseColor; + + float3 blurredNormal = lerp(N, Nw, NormalBlurring); + + float3 V = normalize(viewInv[3].xyz - IN.worldPosition.xyz); + + float4 specular = float4(0.028, 0.028, 0.028, 1); + specular.rgb *= SpecularColor; + + if (UseSpecularTexture) { + float2 opacityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 SpecularTextureSample = SpecularTexture.Sample(SamplerAnisoWrap, opacityUV); + + specular.rgb *= pow(SpecularTextureSample.rgb, gammaCorrection); + + if (UseSpecularTextureAlpha) { + specular.a = SpecularTextureSample.a; + } + } + + float cavity = 1; + if (UseCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float CavityTextureSample = CavityTexture.Sample(SamplerAnisoWrap, cavityUV); + + cavity = lerp(1, pow(CavityTextureSample, gammaCorrection), CavityAmount); + } + + float microCavity = 1; + if (UseMicroCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float MicroCavityTextureSample = MicroCavityTexture.Sample(SamplerAnisoWrap, cavityUV * MicroScale); + + microCavity = lerp(1, pow(MicroCavityTextureSample, gammaCorrection), MicroCavityAmount); + } + + specular.rgb *= cavity * microCavity; // We apply cavity on the specular before it is sent to the fresnel + + float roughness = Roughness; + if (UseSpecularTextureAlpha) { + roughness *= specular.a; + } + + float scatteringRadius = 1; + if (UseScatteringRadiusTexture) { + float2 scatteringUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 scatteringRadiusTextureSample = ScatteringRadiusTexture.Sample(SamplerAnisoWrap, scatteringUV); + + scatteringRadius *= pow(scatteringRadiusTextureSample, gammaCorrection); + } + + // Opacity: + float opacity = saturate(diffuse.a * Opacity); + + // Occlusion: + float3 ambientOcclusion = float3(1, 1, 1); + if (UseAmbientOcclusionTexture) { + float2 aomapUV = pickTexcoord(OcclusionTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 aomapTextureSample = OcclusionTexture.Sample(SamplerAnisoWrap, aomapUV).rgb; + ambientOcclusion *= lerp(1, pow(aomapTextureSample.rgb, gammaCorrection), OcclusionAmount); + } + + float3 thickness = float3(1, 1, 1); + if (UseThicknessTexture) { + float2 thicknessUV = pickTexcoord(ThicknessTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + thickness = pow(BackScatteringThicknessTexture.Sample(SamplerAnisoWrap, thicknessUV), gammaCorrection).xyz; + } + + float3 skinOcclusion = coloredOcclusion(diffuse, ambientOcclusion); // Colored occlusion for skin + + float softenMask = 1.0f; + + float2 screenCoord = IN.screenCoord.xy / IN.screenCoord.w; + //float2 currentScreenSize = screenSize; // TO DO FIND A WAY TO GET SCREEN SIZE, MAYA BUG ? + float2 currentScreenSize = float2(1024, 512); + + // -------- + // LIGHTS: + // -------- + // future todo: Maya could pass light info in array so we can loop any number of lights. + + // light 0: + lightOut light0 = CalculateLight(light0Enable, light0Type, light0AttenScale, light0Pos, IN.worldPosition.xyz, + light0Color, light0Intensity, light0Dir, light0ConeAngle, light0FallOff, light0Matrix, + light0ShadowMap, light0ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 1: + lightOut light1 = CalculateLight(light1Enable, light1Type, light1AttenScale, light1Pos, IN.worldPosition.xyz, + light1Color, light1Intensity, light1Dir, light1ConeAngle, light1FallOff, light1Matrix, + light1ShadowMap, light1ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 2: + lightOut light2 = CalculateLight(light2Enable, light2Type, light2AttenScale, light2Pos, IN.worldPosition.xyz, + light2Color, light2Intensity, light2Dir, light2ConeAngle, light2FallOff, light2Matrix, + light2ShadowMap, light2ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + float3 lightTotal = light0.Color + light1.Color + light2.Color; + + + // ---------------------- + // IMAGE BASED LIGHTING + // ---------------------- + + // Specular IBL + float3 specularIBL = float3(0, 0, 0); + bool reflectMapUsed = UseSpecCubeIBL; + if (reflectMapUsed) { + int lod = 7; // Hard coded mip map level + + float3 reflectionVector = reflect(-V, N); + + reflectionVector = RotateVectorYaw(reflectionVector, SkyRotation); + reflectionVector = normalize(reflectionVector); + float NdotV = saturate(dot(N, V)); + float3 F = F_LagardeSchlick(specular, 1 - roughness, NdotV); + + specularIBL += SpecularCubeIBL.SampleLevel(CubeMapSampler, reflectionVector, lod * roughness).rgb * F; + } + + // Diffuse IBL + float3 diffuseIBL = float3(0, 0, 0); + bool useDiffuseIBL = UseDiffuseIBLMap; + if (useDiffuseIBL) { + // We use the world normal to sample the lighting texture + float3 diffuseIBLVec_High = N; + float3 diffuseIBLVec_Low = blurredNormal; + + diffuseIBLVec_High = RotateVectorYaw(diffuseIBLVec_High, SkyRotation); + diffuseIBLVec_High = normalize(diffuseIBLVec_High); + + diffuseIBLVec_Low = RotateVectorYaw(diffuseIBLVec_Low, SkyRotation); + diffuseIBLVec_Low = normalize(diffuseIBLVec_Low); + + float3 diffuseIBL_High = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_High, 0).rgb; + float3 diffuseIBL_Low = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_Low, 0).rgb; + + diffuseIBL = diffuseSkinIBL(float3(skinCoeffX, skinCoeffY, skinCoeffZ), diffuseIBL_High, diffuseIBL_Low); + } + + // ---------------------- + // FINAL COLOR AND ALPHA: + // ---------------------- + + float3 result = float3(0, 0, 0); + + result += diffuse * diffuseIBL * DiffuseIBLIntensity * skinOcclusion; + + result += specularIBL * SpecularIBLIntensity * specularOcclusion(N, V, ambientOcclusion); + + result += lightTotal; + + //result = N; + + // do gamma correction in shader: + if (!MayaFullScreenGamma) + result = pow(result, 1 / gammaCorrection); + + // final alpha: + float transparency = opacity; + transparency = saturate(transparency); // keep 0-1 range + + return float4(result, transparency); +} + + +#ifdef _MAYA_ +void Peel(SHADERDATA IN) { + float currZ = abs(mul(float4(IN.worldPosition, 1.0f), view).z); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + float2 UV = Pndc.xy / Pndc.w * float2(0.5f, -0.5f) + 0.5f; + float prevZ = transpDepthTexture.Sample(SamplerShadowDepth, UV).r; + float opaqZ = opaqueDepthTexture.Sample(SamplerShadowDepth, UV).r; + float bias = 0.00002f; + + if (currZ < prevZ * (1.0f + bias) || currZ > opaqZ * (1.0f - bias)) { + discard; + } +} + +float4 LinearDepth(SHADERDATA IN) { + return abs(mul(float4(IN.worldPosition, 1.0f), view).z); +} + +float4 DepthComplexity(float opacity) { + return opacity > 0.001f ? 1.0f : 0.0f; +} + +struct MultiOut2 { + float4 target0 : SV_Target0; + float4 target1 : SV_Target1; +}; + +MultiOut2 fTransparentPeel(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = LinearDepth(IN); + return OUT; +} + +MultiOut2 fTransparentPeelAndAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +MultiOut2 fTransparentWeightedAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +//------------------------------------ +// wireframe pixel shader +//------------------------------------ +float4 fwire(SHADERDATA IN) : SV_Target { + return float4(0, 0, 1, 1); +} + + +//------------------------------------ +// pixel shader for shadow map generation +//------------------------------------ +//float4 ShadowMapPS( float3 Pw, float4x4 shadowViewProj ) +float4 ShadowMapPS(SHADERDATA IN) : SV_Target { + // clip as early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + + // divide Z and W component from clip space vertex position to get final depth per pixel + float retZ = Pndc.z / Pndc.w; + + retZ += fwidth(retZ); + return retZ.xxxx; +} +#endif + +//----------------------------------- +// Objects without tessellation +//------------------------------------ +technique11 TessellationOFF < + bool overridesDrawState = false; // we do not supply our own render state settings + int isTransparent = 3; + // objects with clipped pixels need to be flagged as isTransparent to avoid the occluding underlying geometry since Maya renders the object with flat shading when computing depth + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + // 'VariableNameAsAttributeName = false' can be used to tell Maya's DX11ShaderNode to use the UIName annotation string for the Maya attribute name instead of the shader variable name. + // When changing this option, the attribute names generated for the shader inside Maya will change and this can have the side effect that older scenes have their shader attributes reset to default. + // bool VariableNameAsAttributeName = false; + +#ifdef _MAYA_ + // Tells Maya that the effect supports advanced transparency algorithm, + // otherwise Maya would render the associated objects simply by alpha + // blending on top of other objects supporting advanced transparency + // when the viewport transparency algorithm is set to depth-peeling or + // weighted-average. + bool supportsAdvancedTransparency = true; +#endif +> +{ + pass p0 < string drawContext = "colorPass"; > { // tell maya during what draw context this shader should be active, in this case 'Color' + // even though overrideDrawState is false, we still set the pre-multiplied alpha state here in + // case Maya is using 'Depth Peeling' transparency algorithm + // This unfortunately won't solve sorting issues, but at least our object can draw transparent. + // If we don't set this, the object will always be opaque. + // In the future, hopefully ShaderOverride nodes can participate properly in Maya's Depth Peeling setup +#ifdef _MAYA_ + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); +#endif + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, f())); + } + +#ifdef _MAYA_ + pass pTransparentPeel < string drawContext = "transparentPeel"; > { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +#endif +} + +#ifdef _SUPPORTTESSELLATION_ +//----------------------------------- +// Objects with tessellation +//------------------------------------ +// Vertex Index Buffer options: +// index_buffer_type: None; // no divergent normals and no displacement crack fix +// index_buffer_type: PNAEN9; // divergent normals crack fix; no displacement UV seam crack fix +// index_buffer_type: PNAEN18, // crack fix for divergent normals and UV seam displacement +technique11 TessellationON < + string index_buffer_type = "PNAEN18"; // tell Maya what type of index buffer we want. Must be unique name per generator + bool overridesDrawState = false; + int isTransparent = 3; + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + bool supportsAdvancedTransparency = true; > { + pass p0 < string drawContext = "colorPass"; > { + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, f())); + } + + pass pTransparentPeel < string drawContext = "transparentPeel";> { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +} + +//----------------------------------- +// Wireframe +//------------------------------------ +technique11 WireFrame < + string index_buffer_type = "PNAEN18"; + bool overridesDrawState = false; // since we only change the fillMode, it can remain on false. If we changed the blend state, it would have to be true + int isTransparent = 0; > { + pass p0 < string drawContext = "colorPass"; > { + SetRasterizerState(WireframeCullFront); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, fwire())); + } +} +#endif diff --git a/data/shaders/dx11_shd_teeth.fx b/data/shaders/dx11_shd_teeth.fx new file mode 100644 index 00000000..6b745418 --- /dev/null +++ b/data/shaders/dx11_shd_teeth.fx @@ -0,0 +1,2872 @@ +// Maya Skin shader made by Charles Greivelding 2014 + +//------------------------------------ +// Notes +//------------------------------------ +// Shader uses 'pre-multiplied alpha' as its render state and this Uber Shader is build to work in unison with that. +// Alternatively, in Maya, the dx11Shader node allows you to set your own render states by supplying the 'overridesDrawState' annotation in the technique +// You may find it harder to get proper transparency sorting if you choose to do so. + +// The technique annotation 'isTransparent' is used to tell Maya how treat the technique with respect to transparency. +// - If set to 0 the technique is always considered opaque +// - If set to 1 the technique is always considered transparent +// - If set to 2 the plugin will check if the parameter marked with the OPACITY semantic is less than 1.0 +// - If set to 3 the plugin will use the transparencyTest annotation to create a MEL procedure to perform the desired test. +// Maya will then render the object twice. Front faces follow by back faces. + +// For some objects you may need to switch the Transparency Algorithm to 'Depth Peeling' to avoid transparency issues. +// Models that require this usually have internal faces. + +//------------------------------------ +// Defines +//------------------------------------ +// how many mip map levels should Maya generate or load per texture. +// 0 means all possible levels +// some textures may override this value, but most textures will follow whatever we have defined here +// If you wish to optimize performance (at the cost of reduced quality), you can set NumberOfMipMaps below to 1 + +#define NumberOfMipMaps 0 +#define PI 3.1415926 +#define _3DSMAX_SPIN_MAX 99999 + +#ifndef _MAYA_ +#define _3DSMAX_ // at time of writing this shader, Nitrous driver did not have the _3DSMAX_ define set +#define _ZUP_ // Maya is Y up, 3dsMax is Z up +#endif + +#ifdef _MAYA_ +#define _SUPPORTTESSELLATION_ // at time of writing this shader, 3dsMax did not support tessellation +#endif + +//------------------------------------ +// State +//------------------------------------ +#ifdef _MAYA_ +RasterizerState WireframeCullFront { + CullMode = Front; + FillMode = WIREFRAME; +}; + +BlendState PMAlphaBlending { + AlphaToCoverageEnable = FALSE; + BlendEnable[0] = TRUE; + SrcBlend = ONE; + DestBlend = INV_SRC_ALPHA; + BlendOp = ADD; + SrcBlendAlpha = ONE; // Required for hardware frame render alpha channel + DestBlendAlpha = INV_SRC_ALPHA; + BlendOpAlpha = ADD; + RenderTargetWriteMask[0] = 0x0F; +}; +#endif + +//------------------------------------ +// Map Channels +//------------------------------------ +#ifdef _3DSMAX_ +int texcoord0 : Texcoord < + int Texcoord = 0; + int MapChannel = 1; + string UIWidget = "None"; +>; + +int texcoord1 : Texcoord < + int Texcoord = 1; + int MapChannel = 2; + string UIWidget = "None"; +>; + +int texcoord2 : Texcoord < + int Texcoord = 2; + int MapChannel = 3; + string UIWidget = "None"; +>; +#endif + +//------------------------------------ +// Samplers +//------------------------------------ +SamplerState CubeMapSampler { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; +}; + +SamplerState SamplerAnisoWrap { + Filter = ANISOTROPIC; + AddressU = Wrap; + AddressV = Wrap; +}; + +SamplerState SamplerAnisoClamp { + Filter = ANISOTROPIC; + AddressU = Clamp; + AddressV = Clamp; +}; + +SamplerState SamplerShadowDepth { + Filter = MIN_MAG_MIP_POINT; + AddressU = Border; + AddressV = Border; + BorderColor = float4(1.0f, 1.0f, 1.0f, 1.0f); +}; + +//------------------------------------ +// Textures +//------------------------------------ + +Texture2D LutTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS LUT Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +Texture2D DitherTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Dither Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 203; + int UVEditorOrder = 2; +>; + +// --------------------------------------------- +// Blend GROUP +// --------------------------------------------- + +bool UseBlendTexture < + string UIGroup = "Wrinkle mixing"; + string UIName = "Enable Wrinkle Mixing"; + int UIOrder = 919; +> = false; + + + + + + +Texture2D OcclusionTexture < + string UIGroup = "Occlusion"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Ambient Occlusion Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 401; + int UVEditorOrder = 2; +>; + +Texture2D ScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "SSS Radius Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 209; + int UVEditorOrder = 2; +>; + +Texture2D CavityTexture < + string UIGroup = "Cavity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 501; + int UVEditorOrder = 4; +>; + +Texture2D DiffuseTexture < + string UIGroup = "Diffuse"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 201; + int UVEditorOrder = 1; +>; + +Texture2D SpecularTexture < + string UIGroup = "Specular"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 302; + int UVEditorOrder = 4; +>; + +Texture2D NormalTexture < + string UIGroup = "Normal"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; // If mip maps exist in texture, Maya will load them. So user can pre-calculate and re-normalize mip maps for normal maps in .dds + int UIOrder = 601; + int UVEditorOrder = 5; +>; + +Texture2D MicroCavityTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Cavity Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 701; + int UVEditorOrder = 5; +>; + +Texture2D MicroNormalTexture < + string UIGroup = "Micro Details"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Micro Normal Map"; + string ResourceType = "2D"; + int mipmaplevels = 0; + int UIOrder = 704; + int UVEditorOrder = 5; +>; + +#ifdef _SUPPORTTESSELLATION_ +Texture2D DisplacementTexture < + string UIGroup = "Tessellation and Displacement"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Displacement Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 902; + int UVEditorOrder = 8; +>; +#endif + +Texture2D BackScatteringThicknessTexture < + string UIGroup = "BackScattering"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Thickness Map"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 215; + int UVEditorOrder = 10; +>; + +Texture2D OpacityMaskTexture < + string UIGroup = "Opacity"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Opacity Mask"; + string ResourceType = "2D"; + int mipmaplevels = NumberOfMipMaps; + int UIOrder = 800; + int UVEditorOrder = 12; +>; + +TextureCube DiffuseCubeIBL < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Diffuse Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; // Use (or load) max number of mip map levels so we can use blurring + int UIOrder = 108; + int UVEditorOrder = 10; +>; + +TextureCube SpecularCubeIBL : environment < + string UIGroup = "IBL Settings"; + string ResourceName = ""; + string UIWidget = "FilePicker"; + string UIName = "Specular Cubemap"; + string ResourceType = "Cube"; + int mipmaplevels = 0; + int UIOrder = 111; + int UVEditorOrder = 6; +>; + +//------------------------------------ +// Shadow Maps +//------------------------------------ +Texture2D light0ShadowMap : SHADOWMAP < + string Object = "Light 0"; // UI Group for lights, auto-closed + string UIWidget = "None"; + int UIOrder = 5010; +>; + +Texture2D light1ShadowMap : SHADOWMAP < + string Object = "Light 1"; + string UIWidget = "None"; + int UIOrder = 5020; +>; + +Texture2D light2ShadowMap : SHADOWMAP < + string Object = "Light 2"; + string UIWidget = "None"; + int UIOrder = 5030; +>; + +//------------------------------------ +// Internal depth textures for Maya depth-peeling transparency +//------------------------------------ +#ifdef _MAYA_ + +Texture2D transpDepthTexture : transpdepthtexture < + string UIWidget = "None"; +>; + +Texture2D opaqueDepthTexture : opaquedepthtexture < + string UIWidget = "None"; +>; + +#endif + +//------------------------------------ +// Per Frame parameters +//------------------------------------ +cbuffer UpdatePerFrame : register(b0) { + float4x4 viewInv : ViewInverse < string UIWidget = "None"; >; + float4x4 view : View < string UIWidget = "None"; >; + float4x4 prj : Projection < string UIWidget = "None"; >; + float4x4 viewPrj : ViewProjection < string UIWidget = "None"; >; + + // A shader may wish to do different actions when Maya is rendering the preview swatch (e.g. disable displacement) + // This value will be true if Maya is rendering the swatch + bool IsSwatchRender : MayaSwatchRender < string UIWidget = "None"; > = false; + float2 screenSize : ViewportPixelSize < string UIWidget = "None"; >; + + // If the user enables viewport gamma correction in Maya's global viewport rendering settings, the shader should not do gamma again + bool MayaFullScreenGamma : MayaGammaCorrection < string UIWidget = "None"; > = false; +} + + +//------------------------------------ +// Per Object parameters +//------------------------------------ +cbuffer UpdatePerObject : register(b1) { + float4x4 world : World < string UIWidget = "None"; >; + float4x4 worldIT : WorldInverseTranspose < string UIWidget = "None"; >; +#ifndef _SUPPORTTESSELLATION_ + float4x4 wvp : WorldViewProjection < string UIWidget = "None"; >; +#endif + +// --------------------------------------------- +// Lighting Settings GROUP +// --------------------------------------------- +bool LinearSpaceLighting < + string UIGroup = "Lighting Settings"; + string UIName = "Linear Space Lighting"; + int UIOrder = 100; +> = true; + +bool UseShadows < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIName = "Shadows"; + int UIOrder = 101; +#endif +> = true; + +float shadowMultiplier < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UIMax = 1.000; + float UIStep = 0.001; + string UIName = "Shadow Strength"; + int UIOrder = 102; +#endif +> = { 1.0f }; + +// This offset allows you to fix any in-correct self shadowing caused by limited precision. +// This tends to get affected by scene scale and polygon count of the objects involved. +float shadowDepthBias : ShadowMapBias < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string UIGroup = "Lighting Settings"; + string UIWidget = "Slider"; + float UIMin = 0.000; + float UISoftMax = 10.000; + float UIStep = 0.001; + string UIName = "Shadow Bias"; + int UIOrder = 103; +#endif +> = { 0.01f }; + +// flips back facing normals to improve lighting for things like sheets of hair or leaves +bool flipBackfaceNormals < + string UIGroup = "Lighting Settings"; + string UIName = "Double Sided Lighting"; + int UIOrder = 104; +> = true; + +// -- light props are inserted here via UIOrder 20 - 49 + +// --------------------------------------------- +// IBL Settings GROUP +// --------------------------------------------- + +float SkyRotation < + string UIGroup = "IBL Settings"; + string UIName = "Sky Rotation"; + float UISoftMin = 0; + float UISoftMax = 360; + float UIMin = 0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1; + int UIOrder = 105; + string UIWidget = "Slider"; +> = { 0.0f }; + +bool UseDiffuseIBLMap < + string UIGroup = "IBL Settings"; + string UIName = "Use Diffuse Cubemap"; + int UIOrder = 106; +> = false; + +float DiffuseIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Diffuse IBL Intensity"; + int UIOrder = 107; +> = 1.0; + +bool UseSpecCubeIBL < + string UIGroup = "IBL Settings"; + string UIName = "Use Specular Cubemap"; + int UIOrder = 109; +> = false; + +float SpecularIBLIntensity < + string UIGroup = "IBL Settings"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.001; + string UIName = "Specular IBL Intensity"; + int UIOrder = 110; +> = 1.0; + +// --------------------------------------------- +// Diffuse GROUP +// --------------------------------------------- + +bool UseDiffuseTexture < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map"; + int UIOrder = 200; +> = false; + + +bool UseDiffuseTextureAlpha < + string UIGroup = "Diffuse"; + string UIName = "Use Diffuse Map Alpha"; + int UIOrder = 201; +> = false; + +float3 DiffuseColor : Diffuse < + string UIGroup = "Diffuse"; + string UIName = "Diffuse Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 202; +> = { 1.0f, 1.0f, 1.0f }; + +// --------------------------------------------- +// SSS GROUP +// --------------------------------------------- + +float skinCoeffX < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient R"; + int UIOrder = 204; +> = 1.0; + +float skinCoeffY < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient G"; + int UIOrder = 205; +> = 0.5; + +float skinCoeffZ < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Coeffient B"; + int UIOrder = 206; +> = 0.25; + +float NormalBlurring < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Softness"; + int UIOrder = 207; +> = 0.25; + +bool UseScatteringRadiusTexture < + string UIGroup = "SubSurfaceScattering"; + string UIName = "Use SSS Radius Map"; + int UIOrder = 209; +> = false; + +float skinScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Radius"; + int UIOrder = 210; +> = 0.25; + +float shadowBlur < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Blur"; + int UIOrder = 211; +> = 1.0; + +float shadowDither < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Dither"; + int UIOrder = 211; +> = 1.0; + +float shadowScattering < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "SSS Shadow Scattering"; + int UIOrder = 212; +> = 1.0; + +float shadowSaturation < + string UIGroup = "SubSurfaceScattering"; + float UIMin = 0.0; + float UISoftMax = 4.0; + float UIMax = 4; + float UIStep = 0.1; + string UIName = "SSS Shadow Saturation"; + int UIOrder = 213; +> = 1.0; + +// --------------------------------------------- +// BackScattering GROUP +// --------------------------------------------- + +bool UseTranslucency < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering"; + int UIOrder = 214; +> = false; + +bool UseThicknessTexture < + string UIGroup = "BackScattering"; + string UIName = "Use Thickness Map"; + int UIOrder = 216; +> = false; + +float skinScatteringRoughness < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Width"; + int UIOrder = 217; +> = 1.0; + +/*float3 skinScatteringInnerColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Inner Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 215; +> = {0.25f, 0.05f, 0.02f };*/ + +float3 skinScatteringOuterColor < + string UIGroup = "BackScattering"; + string UIName = "Back Scattering Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 218; +> = { 0.25f, 0.05f, 0.02f }; + +float skinScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Amount"; + int UIOrder = 219; +> = 1.0; + +float skinAmbientScatteringAmount < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 6.0; + float UIMax = 6; + float UIStep = 0.1; + string UIName = "Back Scattering Ambient Amount"; + int UIOrder = 220; +> = 1.0; + +/* float skinScatteringPlane < + string UIGroup = "BackScattering"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1; + float UIStep = 0.1; + string UIName = "Back Scattering Far Plane"; + int UIOrder = 218; +> = 1.0;*/ + +// --------------------------------------------- +// Specular GROUP +// --------------------------------------------- + +bool UseSpecularTexture < + string UIGroup = "Specular"; + string UIName = "Use Specular Map"; + int UIOrder = 301; +> = false; + +bool UseSpecularTextureAlpha < + string UIGroup = "Specular"; + string UIName = "Use Roughness Map Alpha"; + int UIOrder = 301; +> = false; + +float3 SpecularColor : Specular < + string UIGroup = "Specular"; + string UIName = "Specular Color"; + string UIWidget = "ColorPicker"; + int UIOrder = 303; +> = { 1.0f, 1.0f, 1.0f }; + + +float LobeMix < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Lobe Mixing"; + int UIOrder = 304; +> = 0.75; + +float Roughness < + string UIGroup = "Specular"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 1.0; + float UIMax = 1.0; + float UIStep = 0.01; + string UIName = "Roughness multiplier"; + int UIOrder = 305; +> = .2; + +// --------------------------------------------- +// Occlusion GROUP +// --------------------------------------------- + +bool UseAmbientOcclusionTexture < + string UIGroup = "Occlusion"; + string UIName = "Use Occlusion Map"; + int UIOrder = 400; +> = false; + +float OcclusionAmount < + string UIGroup = "Occlusion"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Occlusion Amount"; + int UIOrder = 402; +> = 1.0; + +// --------------------------------------------- +// Cavity GROUP +// --------------------------------------------- + +bool UseCavityTexture < + string UIGroup = "Cavity"; + string UIName = "Use Cavity Map"; + int UIOrder = 500; +> = false; + +float CavityAmount < + string UIGroup = "Cavity"; + string UIWidget = "Slider"; + float UIMin = 0.01; + float UISoftMax = 2.0; + float UIMax = 2.0; + float UIStep = 0.01; + string UIName = "Cavity Amount"; + int UIOrder = 502; +> = 1.0; + +// --------------------------------------------- +// Normal GROUP +// --------------------------------------------- +bool UseNormalTexture < + string UIGroup = "Normal"; + string UIName = "Use Normal Map"; + int UIOrder = 600; +> = false; + +float NormalHeight < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Normal Height"; + int UIOrder = 603; +> = 1.0; + +bool SupportNonUniformScale < + string UIGroup = "Normal"; + string UIName = "Support Non-Uniform Scale"; + int UIOrder = 604; +> = true; + +int NormalCoordsysX < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal X (Red)"; + int UIOrder = 605; +> = 0; + +int NormalCoordsysY < + string UIGroup = "Normal"; + string UIWidget = "Slider"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + string UIFieldNames = "Positive:Negative"; + string UIName = "Normal Y (Green)"; + int UIOrder = 606; +> = 0; + +// --------------------------------------------- +// Micro Details GROUP +// --------------------------------------------- + +bool UseMicroCavityTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Cavity Map"; + int UIOrder = 700; +> = false; + +float MicroCavityAmount < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 2.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Cavity Amount"; + int UIOrder = 702; +> = 1.0; + +bool UseMicroNormalTexture < + string UIGroup = "Micro Details"; + string UIName = "Use Micro Normal Map"; + int UIOrder = 703; +> = false; + +float MicroNormalHeight < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 5.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Normal Height"; + int UIOrder = 705; +> = 1.0; + +float MicroScale < + string UIGroup = "Micro Details"; + string UIWidget = "Slider"; + float UIMin = 16.0; + float UISoftMax = 256.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + string UIName = "Micro Scale"; + int UIOrder = 706; +> = 32; + +// --------------------------------------------- +// Opacity GROUP +// --------------------------------------------- +float Opacity : OPACITY < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity"; + int UIOrder = 801; +> = 1.0; + +bool UseOpacityMaskTexture < + string UIGroup = "Opacity"; + string UIName = "Opacity Mask"; + int UIOrder = 802; +> = false; + +// at what value do we clip away pixels +float OpacityMaskBias < + string UIGroup = "Opacity"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.001; + string UIName = "Opacity Mask Bias"; + int UIOrder = 803; +> = 0.1; + +#ifdef _SUPPORTTESSELLATION_ +// --------------------------------------------- +// Tessellation and Displacement GROUP +// --------------------------------------------- +int DisplacementModel < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Model"; + string UIFieldNames = "Grayscale:Tangent Vector"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 900; +> = false; + +bool UseDisplacementMap < + string UIGroup = "Tessellation and Displacement"; + string UIName = "Displacement Map"; + int UIOrder = 901; +> = false; + +int VectorDisplacementCoordSys < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + string UIFieldNames = "Mudbox (XZY):Maya (XYZ)"; + string UIName = "Displacement Coordsys"; + float UIMin = 0; + float UIMax = 1; + float UIStep = 1; + int UIOrder = 903; +> = 0; + +float DisplacementHeight < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 10.0; + string UIName = "Displacement Height"; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + int UIOrder = 904; +> = 0.5; + +// This allows you to control what the 'base' value for displacement is. +// When the offset value is 0.5, that means that a gray value (color: 128,128,128) will get 0 displacement. +// A value of 0 would then dent in. +// A value of 1 would then extrude. +float DisplacementOffset < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = -1.0; + float UISoftMax = 1.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.1; + string UIName = "Displacement Offset"; + int UIOrder = 905; +> = 0.5; + +// This gives the artist control to prevent this shader from clipping away faces to quickly when displacement is actually keeping the faces on screen. +// This is also important for e.g. shadow map generation to make sure displaced vertices are not clipped out of the light's view +// See BBoxExtraScale for artist control over Maya clipping the entire object away when it thinks it leaves the view. +float DisplacementClippingBias < + string UIGroup = "Tessellation and Displacement"; + float UISoftMin = 0.0; + float UISoftMax = 99.0; + float UIMin = -(_3DSMAX_SPIN_MAX); + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Displacement Clipping Bias"; + int UIOrder = 906; +> = 5.0; + +// This gives the artist control to prevent maya from clipping away the entire object to fast in case displacement is used. +// Its semantic has to be BoundingBoxExtraScale +float BBoxExtraScale : BoundingBoxExtraScale < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Bounding Box Extra Scale"; + int UIOrder = 907; +> = 1.0; + +float TessellationRange < + string UIGroup = "Tessellation and Displacement"; + string UIWidget = "Slider"; + float UIMin = 0.0; + float UISoftMax = 999.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 1.0; + string UIName = "Tessellation Range"; + int UIOrder = 908; +> = { 0 }; + +float TessellationMin < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 1.0; + float UISoftMax = 10.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.5; + string UIName = "Tessellation Minimum"; + int UIOrder = 909; +> = 3.0; + +float FlatTessellation < + string UIGroup = "Tessellation and Displacement"; + float UIMin = 0.0; + float UIMax = 1.0; + float UIStep = 0.1; + string UIName = "Flat Tessellation"; + int UIOrder = 910; +> = 0.0; +#endif + +// --------------------------------------------- +// UV assignment GROUP +// --------------------------------------------- +// Use the Surface Data Section to set your UVset names for each Texcoord. +// E.g. TexCoord1 = uv:UVset +// Then pick a Texcoord in the UV Section to use that UVset for a texture. + +int DiffuseTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Diffuse Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2002; +> = 0; + +int OcclusionTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Ambient Occlusion Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2003; +> = 1; + +int OpacityMaskTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Opacity Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2005; +> = 0; + +int SpecularTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Specular Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2006; +> = 0; + +int NormalTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Normal Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2008; +> = 0; + +#ifdef _SUPPORTTESSELLATION_ +int DisplacementTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Displacement Map UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2010; +> = 0; +#endif + +int ThicknessTexcoord < + string UIGroup = "UV"; + string UIWidget = "Slider"; + string UIFieldNames = "TexCoord0:TexCoord1:TexCoord2"; + string UIName = "Translucency Mask UV"; + float UIMin = 0; + float UIMax = 2; + float UIStep = 1; + int UIOrder = 2011; +> = 0; +} //end UpdatePerObject cbuffer + +//------------------------------------ +// Light parameters +//------------------------------------ +cbuffer UpdateLights : register(b2) { +// --------------------------------------------- +// Light 0 GROUP +// --------------------------------------------- +// This value is controlled by Maya to tell us if a light should be calculated +// For example the artist may disable a light in the scene, or choose to see only the selected light +// This flag allows Maya to tell our shader not to contribute this light into the lighting +bool light0Enable : LIGHTENABLE < +string Object = "Light 0"; // UI Group for lights, auto-closed +string UIName = "Enable Light 0"; +int UIOrder = 20; +#ifdef _MAYA_ +> = false; // maya manages lights itself and defaults to no lights +#else +> = true; // in 3dsMax we should have the default light enabled +#endif + +// follows LightParameterInfo::ELightType +// spot = 2, point = 3, directional = 4, ambient = 5, +int light0Type : LIGHTTYPE < + string Object = "Light 0"; + string UIName = "Light 0 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + int UIOrder = 21; + float UIMin = 0; + float UIMax = 5; + float UIStep = 1; +> = 2; // default to spot so the cone angle etc work when "Use Shader Settings" option is used + +float3 light0Pos : POSITION < + string Object = "Light 0"; + string UIName = "Light 0 Position"; + string Space = "World"; + int UIOrder = 22; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +float3 light0Color : LIGHTCOLOR < + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Color"; + string UIWidget = "Color"; + int UIOrder = 23; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light0Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 24; +#endif +> = { 1.0f }; + +float3 light0Dir : DIRECTION < + string Object = "Light 0"; + string UIName = "Light 0 Direction"; + string Space = "World"; + int UIOrder = 25; + int RefID = 0; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light0ConeAngle : HOTSPOT // In radians +#else +float light0ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 26; +#endif +> = { 0.46f }; + +#ifdef _MAYA_ +float light0FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light0FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 0"; +#ifdef _3DSMAX_ + int LightRef = 0; + string UIWidget = "None"; +#else + string UIName = "Light 0 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 27; +#endif +> = { 0.7f }; + +float light0AttenScale : DECAYRATE < + string Object = "Light 0"; + string UIName = "Light 0 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 28; +> = { 0.0 }; + +bool light0ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 0"; + string UIName = "Light 0 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 29; +#endif +> = true; + +float4x4 light0Matrix : SHADOWMAPMATRIX < + string Object = "Light 0"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 1 GROUP +// --------------------------------------------- +bool light1Enable : LIGHTENABLE < + string Object = "Light 1"; + string UIName = "Enable Light 1"; + int UIOrder = 30; +> = false; + +int light1Type : LIGHTTYPE < + string Object = "Light 1"; + string UIName = "Light 1 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 31; +> = 2; + +float3 light1Pos : POSITION < + string Object = "Light 1"; + string UIName = "Light 1 Position"; + string Space = "World"; + int UIOrder = 32; + int RefID = 1; // 3DSMAX +> = { -100.0f, 100.0f, 100.0f }; + +float3 light1Color : LIGHTCOLOR < + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Color"; + string UIWidget = "Color"; + int UIOrder = 33; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light1Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 34; +#endif +> = { 1.0f }; + +float3 light1Dir : DIRECTION < + string Object = "Light 1"; + string UIName = "Light 1 Direction"; + string Space = "World"; + int UIOrder = 35; + int RefID = 1; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light1ConeAngle : HOTSPOT // In radians +#else +float light1ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 36; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light1FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light1FallOff : LIGHTFALLOFF +#endif +< + string Object = "Light 1"; +#ifdef _3DSMAX_ + int LightRef = 1; + string UIWidget = "None"; +#else + string UIName = "Light 1 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 37; +#endif +> = { 0.0f }; + +float light1AttenScale : DECAYRATE < + string Object = "Light 1"; + string UIName = "Light 1 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 38; +> = { 0.0 }; + +bool light1ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 1"; + string UIName = "Light 1 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 39; +#endif +> = true; + +float4x4 light1Matrix : SHADOWMAPMATRIX < + string Object = "Light 1"; + string UIWidget = "None"; +>; + +// --------------------------------------------- +// Light 2 GROUP +// --------------------------------------------- +bool light2Enable : LIGHTENABLE < + string Object = "Light 2"; + string UIName = "Enable Light 2"; + int UIOrder = 40; +> = false; + +int light2Type : LIGHTTYPE < + string Object = "Light 2"; + string UIName = "Light 2 Type"; + string UIFieldNames = "None:Default:Spot:Point:Directional:Ambient"; + float UIMin = 0; + float UIMax = 5; + int UIOrder = 41; +> = 2; + +float3 light2Pos : POSITION < + string Object = "Light 2"; + string UIName = "Light 2 Position"; + string Space = "World"; + int UIOrder = 42; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, -100.0f }; + +float3 light2Color : LIGHTCOLOR < + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Color"; + string UIWidget = "Color"; + int UIOrder = 43; +#endif +> = { 1.0f, 1.0f, 1.0f }; + +float light2Intensity : LIGHTINTENSITY < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Intensity"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 44; +#endif +> = { 1.0f }; + +float3 light2Dir : DIRECTION < + string Object = "Light 2"; + string UIName = "Light 2 Direction"; + string Space = "World"; + int UIOrder = 45; + int RefID = 2; // 3DSMAX +> = { 100.0f, 100.0f, 100.0f }; + +#ifdef _MAYA_ +float light2ConeAngle : HOTSPOT // In radians +#else +float light2ConeAngle : LIGHTHOTSPOT +#endif +< + string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Cone Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 46; +#endif +> = { 45.0f }; + +#ifdef _MAYA_ +float light2FallOff : FALLOFF // In radians. Sould be HIGHER then cone angle or lighted area will invert +#else +float light2FallOff : LIGHTFALLOFF +#endif +< +string Object = "Light 2"; +#ifdef _3DSMAX_ + int LightRef = 2; + string UIWidget = "None"; +#else + string UIName = "Light 2 Penumbra Angle"; + float UIMin = 0; + float UIMax = PI / 2; + int UIOrder = 47; +#endif +> = { 0.0f }; + +float light2AttenScale : DECAYRATE < + string Object = "Light 2"; + string UIName = "Light 2 Decay"; + float UIMin = 0.0; + float UIMax = _3DSMAX_SPIN_MAX; + float UIStep = 0.01; + int UIOrder = 48; +> = { 0.0 }; + +bool light2ShadowOn : SHADOWFLAG < +#ifdef _3DSMAX_ + string UIWidget = "None"; +#else + string Object = "Light 2"; + string UIName = "Light 2 Casts Shadow"; + string UIWidget = "None"; + int UIOrder = 49; +#endif +> = true; + +float4x4 light2Matrix : SHADOWMAPMATRIX < + string Object = "Light 2"; + string UIWidget = "None"; +>; + +} //end lights cbuffer + +//------------------------------------ +// Structs +//------------------------------------ +struct APPDATA { + float3 position : POSITION; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 normal : NORMAL; + float3 binormal : BINORMAL; + float3 tangent : TANGENT; +}; + +struct SHADERDATA { + float4 position : SV_Position; + float2 texCoord0 : TEXCOORD0; + float2 texCoord1 : TEXCOORD1; + float2 texCoord2 : TEXCOORD2; + float3 worldNormal : NORMAL; + float4 worldTangent : TANGENT; + float3 worldPosition : TEXCOORD3; + float4 screenCoord : TEXCOORD14; + +#ifdef _SUPPORTTESSELLATION_ + // Geometry generated control points: + // .worldPosition is CP0, so we don't need to store it again + float3 CP1 : TEXCOORD4; + float3 CP2 : TEXCOORD5; + + // PN-AEN with displacement fix: + float4 dominantEdge : TEXCOORD6; // both vertices of an edge + float2 dominantVertex : TEXCOORD7; // corner + + // Dominant normal and tangent for VDM crack fix: + // this could be compacted into less texcoords, but left as-is for readability + float3 dominantNormalE0 : TEXCOORD8; + float3 dominantNormalE1 : TEXCOORD9; + float3 dominantNormalCorner : TEXCOORD10; + + float3 dominantTangentE0 : TEXCOORD11; + float3 dominantTangentE1 : TEXCOORD12; + float3 dominantTangentCorner : TEXCOORD13; + + float clipped : CLIPPED; +#endif +}; + + +#ifdef _SUPPORTTESSELLATION_ +struct HSCONSTANTDATA { + float TessFactor[3] : SV_TessFactor; // tessellation amount for each edge of patch + float InsideTessFactor : SV_InsideTessFactor; // tessellation amount within a patch surface (would be float2 for quads) + float3 CPCenter : CENTER; // Geometry generated center control point +}; +#endif + +//------------------------------------ +// BRDF +//------------------------------------ + +float sqr(float x) { + return x*x; +} + +// [Beckmann 1963, "The scattering of electromagnetic waves from rough surfaces"] +float D_Beckmann(float Roughness, float NoH) { + float m = Roughness; + float m2 = m * m; + + float NdotH2 = sqr(NoH); + return exp((NdotH2 - 1) / (m2 * NdotH2)) / (PI * m2 * NdotH2 * NdotH2); +} + +// This function is from Nvidia's Human Head demo +float D_BeckmannNVIDIA(float m, float ndoth) { + float alpha = acos(ndoth); + float ta = tan(alpha); + float val = 1.0 / (m*m*pow(ndoth, 4.0)) * exp(-(ta*ta) / (m*m)); + return val; +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_Schlick(float3 SpecularColor, float LdotH) { + return SpecularColor + (1.0f - SpecularColor) * exp2((-5.55473 * LdotH - 6.98316) * LdotH); +} + +// Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering" +// Lagarde 2011, "Adopting a physically based shading model" +// Lagarde 2012, "Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel" +float3 F_LagardeSchlick(float3 SpecularColor, float Roughness, float NdotV) { + return SpecularColor + (max(1 - Roughness, SpecularColor) - SpecularColor) * exp2((-5.55473 * NdotV - 6.98316) * NdotV); +} + +float3 F_KelemenSzirmaykalos(float3 H, float3 V, float3 F0) { + float base = 1.0 - dot(V, H); + float exponential = pow(base, 5.0); + return exponential + F0 * (1.0 - exponential); +} + +float3 KelemenSzirmaykalos(float3 N, float3 L, float3 V, float roughness, float3 specular) { + float3 result = float3(0.0, 0.0, 0.0); + float NdotL = dot(N, L); + + if (NdotL > 0.0) { + float3 h = L + V; + float3 H = normalize(h); + float NdotH = dot(N, H); + float VdotH = dot(V, H); + float D = D_BeckmannNVIDIA(roughness, NdotH); + float3 F = F_Schlick(specular, VdotH); + float G = 1; + float3 specularDirect = max(D * G * F / dot(h, h), 0); + result = specularDirect * NdotL; // Specular is added for more tuning + } + return result; +} + +float3 PennerSkin(float3 skinCoef, float3 N, float3 L, float3 Nlow, float Curvature) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + pennerNdotL = saturate(pennerNdotL * 0.5 + 0.5); + + float3 pennerlookUp; + pennerlookUp.r = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.r, Curvature)).r; + pennerlookUp.g = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.g, Curvature)).g; + pennerlookUp.b = LutTexture.Sample(SamplerAnisoClamp, float2(pennerNdotL.b, Curvature)).b; + + return pennerlookUp; +} + +float3 PennerSkinNoLUT(float3 skinCoef, float3 N, float3 L, float3 Nlow) { + float3 pennerX = lerp(N, Nlow, skinCoef.x); + float3 pennerY = lerp(N, Nlow, skinCoef.y); + float3 pennerZ = lerp(N, Nlow, skinCoef.z); + + float3 pennerNdotL = float3(dot(pennerX, L), dot(pennerY, L), dot(pennerZ, L)); + + float3 pennerlookUp; + pennerlookUp.r = saturate(pennerNdotL.r*(float3(1, 1, 1).r - skinCoef.r) + skinCoef.r) * (1 - skinCoef.r); + pennerlookUp.g = saturate(pennerNdotL.g*(float3(1, 1, 1).g - skinCoef.g) + skinCoef.g) * (1 - skinCoef.g); + pennerlookUp.b = saturate(pennerNdotL.b*(float3(1, 1, 1).b - skinCoef.b) + skinCoef.b) * (1 - skinCoef.b); + + return pennerlookUp; +} + +float3 diffuseSkinIBL(float3 skinCoef, float3 diffuseIBL_HighFreq, float3 diffuseIBL_LowFreq) { + return lerp(diffuseIBL_HighFreq, diffuseIBL_LowFreq, skinCoef); +} + +//------------------------------------ +// Functions +//------------------------------------ + +float4 ComputeScreenPos(float4 pos) { +#if UNITY_UV_STARTS_AT_TOP + float scale = -1.0; +#else + float scale = 1.0; +#endif + + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*scale) + o.w; + o.zw = pos.zw; + + return o; +} + +// Occlusion taking into account the color of the texture multiplied to it +float3 coloredOcclusion(float3 color, float occlusion) { + float3 coloredOcclusion = lerp(float3(1.0f, 1.0f, 1.0f), color, (1 - occlusion)); + //color *= coloredOcclusion; + return coloredOcclusion; +} + +float specularOcclusion(float3 N, float3 V, float Occlusion) { + const float specularPow = 5.0; + float NdotV = dot(N, V); + float s = saturate(-0.3 + NdotV * NdotV); + + return lerp(pow(Occlusion, specularPow), 1.0, s); +} + +float2 pickTexcoord(int index, float2 t0, float2 t1, float2 t2) { + float2 tcoord = t0; + + if (index == 1) { + tcoord = t1; + } else if (index == 2) { + tcoord = t2; + } + + return tcoord; +} + +float3 RotateVectorYaw(float3 vec, float degreeOfRotation) { + float3 rotatedVec = vec; + float angle = radians(degreeOfRotation); + + rotatedVec.x = (cos(angle) * vec.x) - (sin(angle) * vec.z); + rotatedVec.z = (sin(angle) * vec.x) + (cos(angle) * vec.z); + + return rotatedVec; +} + +// Spot light cone +float lightConeangle(float coneAngle, float coneFalloff, float3 lightVec, float3 lightDir) { + // the cone falloff should be equal or bigger then the coneAngle or the light inverts + // this is added to make manually tweaking the spot settings easier. + if (coneFalloff < coneAngle) { + coneFalloff = coneAngle; + } + + float LdotDir = dot(normalize(lightVec), lightDir); + + // cheaper cone, no fall-off control would be: + // float cone = pow(saturate(LdotDir), 1 / coneAngle); + + // higher quality cone (more expensive): + float cone = smoothstep(cos(coneFalloff), cos(coneAngle), LdotDir); + + return cone; +} + +#define SHADOW_FILTER_TAPS_CNT 10 + +float2 SuperFilterTaps[SHADOW_FILTER_TAPS_CNT] < string UIWidget = "None"; > = { + { -0.84052f, -0.073954f }, + { -0.326235f, -0.40583f }, + { -0.698464f, 0.457259f }, + { -0.203356f, 0.6205847f }, + { 0.96345f, -0.194353f }, + { 0.473434f, -0.480026f }, + { 0.519454f, 0.767034f }, + { 0.185461f, -0.8945231f }, + { 0.507351f, 0.064963f }, + { -0.321932f, 0.5954349f } +}; + +static float4 kernel[25] = { + { 0.530605, 0.613514, 0.739601, 0 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, -3 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, -2.52083 }, + { 0.00500364, 0.00020094, 5.28848e-005, -2.08333 }, + { 0.00700976, 0.00049366, 0.000151938, -1.6875 }, + { 0.0094389, 0.00139119, 0.000416598, -1.33333 }, + { 0.0128496, 0.00356329, 0.00132016, -1.02083 }, + { 0.017924, 0.00711691, 0.00347194, -0.75 }, + { 0.0263642, 0.0119715, 0.00684598, -0.520833 }, + { 0.0410172, 0.0199899, 0.0118481, -0.333333 }, + { 0.0493588, 0.0367726, 0.0219485, -0.1875 }, + { 0.0402784, 0.0657244, 0.04631, -0.0833333 }, + { 0.0211412, 0.0459286, 0.0378196, -0.0208333 }, + { 0.0211412, 0.0459286, 0.0378196, 0.0208333 }, + { 0.0402784, 0.0657244, 0.04631, 0.0833333 }, + { 0.0493588, 0.0367726, 0.0219485, 0.1875 }, + { 0.0410172, 0.0199899, 0.0118481, 0.333333 }, + { 0.0263642, 0.0119715, 0.00684598, 0.520833 }, + { 0.017924, 0.00711691, 0.00347194, 0.75 }, + { 0.0128496, 0.00356329, 0.00132016, 1.02083 }, + { 0.0094389, 0.00139119, 0.000416598, 1.33333 }, + { 0.00700976, 0.00049366, 0.000151938, 1.6875 }, + { 0.00500364, 0.00020094, 5.28848e-005, 2.08333 }, + { 0.00333804, 7.85443e-005, 1.2945e-005, 2.52083 }, + { 0.000973794, 1.11862e-005, 9.43437e-007, 3 } +}; + + +static float2 kernelRandom[32] = { + { 0.254395, 0.385445 }, + { -0.139177, 0.571074 }, + { -0.453510, 0.962140 }, + { 0.482684, 0.346190 }, + { 0.889741, 0.724799 }, + { -0.661047, -0.137344 }, + { -0.193311, -0.313475 }, + { 0.363177, -0.960291 }, + { -0.225866, -0.654962 }, + { 0.407875, 0.431522 }, + { -0.543008, -0.992827 }, + { -0.878493, -0.896999 }, + { -0.641776, 0.130757 }, + { -0.785279, -0.015190 }, + { 0.469054, 0.248633 }, + { -0.820410, -0.562833 }, + { 0.174019, -0.618069 }, + { -0.906449, -0.275099 }, + { -0.655285, -0.956021 }, + { 0.453776, -0.085425 }, + { -0.430788, -0.089530 }, + { -0.587370, -0.851826 }, + { 0.149056, -0.474322 }, + { 0.228684, 0.321661 }, + { -0.668752, -0.829400 }, + { -0.729554, 0.438250 }, + { -0.467018, -0.252882 }, + { 0.090398, 0.618760 }, + { 0.741840, 0.516401 }, + { -0.983891, 0.248701 }, + { -0.162010, -0.714455 }, + { 0.308825, 0.787175 } +}; + +float shadowMapTexelSize < string UIWidget = "None"; > = { 0.00195313 }; // (1.0f / 512) + +// Shadows: +// Percentage-Closer Filtering +float3 lightShadow(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size) { + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float shadowColored = 0; + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + float z = Pndc.z - shadowDepthBias / Pndc.w; + + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 32; ++i) { + float2 offset = kernelRandom[i] * shadowDepth * shadowMapTexelSize; + float2 ditherOffset = mul(offset, rotationMatrix); + ditherOffset = lerp(offset, ditherOffset, shadowDither); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + ditherOffset, 0).x; + + ditherShadow += (sample >= 0.0f) ? 0.0f : (1.0f / 32); + } + } + + return ditherShadow; +} + +float3 lightShadowSkin(float4x4 LightViewPrj, uniform Texture2D ShadowMapTexture, float3 VertexWorldPosition, float2 screenCoord, float skinRadius, float2 size, float2 dir) { + + float4 dither = 2.0 * DitherTexture.SampleLevel(SamplerAnisoWrap, screenCoord.xy * size / 128, 0) - 1.0; + float2x2 rotationMatrix = float2x2(dither.x, dither.y, -dither.y, dither.x); + + float ditherShadow = 0; + float3 shadowColored = float3(0, 0, 0); + + float4 Pndc = mul(float4(VertexWorldPosition.xyz, 1.0), LightViewPrj); + Pndc.xyz /= Pndc.w; + if (Pndc.x > -1.0f && Pndc.x < 1.0f && Pndc.y > -1.0f && Pndc.y < 1.0f && Pndc.z > 0.0f && Pndc.z < 1.0f) { + float2 uv = 0.5f * Pndc.xy + 0.5f; + uv = float2(uv.x, (1.0 - uv.y)); // maya flip Y + + float z = Pndc.z - shadowDepthBias / Pndc.w; + screenCoord.y = 1 - screenCoord.y; + + float shadowDepth = skinRadius; + shadowDepth *= 4.0; + + for (int i = 0; i < 25; ++i) { + float2 offset = kernel[i].a * dir * shadowDepth * shadowMapTexelSize; + offset = mul(offset, rotationMatrix); + float3 sample = z - ShadowMapTexture.SampleLevel(SamplerShadowDepth, uv + offset, 0).x; + ditherShadow = (sample >= 0.0f) ? 0.0f : 1.0f; + + shadowColored += ditherShadow * kernel[i].rgb; + } + } + + return shadowColored; +} + +#ifdef _SUPPORTTESSELLATION_ +// Pick dominant for crack free displacement (original function by Bryan Dudash, modified to support any float3) +float3 PickDominant(float3 vec, // vector to change + float U, float V, float W, // barycoords + float3 DE0A, float3 DE0B, // domimant edge 0 vertex A and B + float3 DE1A, float3 DE1B, // domimant edge 1 vertex A and B + float3 DE2A, float3 DE2B, // domimant edge 2 vertex A and B + float3 DV0, float3 DV1, float3 DV2) { // dominant corners + // Override the texture coordinates along the primitive edges and at the corners. + // Keep the original interpolated coords for the inner area of the primitive. + + float3 dominantVector = vec; + + float edgeThreshold = 0.0001f; + float edgeU = (U == 0) ? 1 : 0; + float edgeV = (V == 0) ? 1 : 0; + float edgeW = (W == 0) ? 1 : 0; + + float corner = ((edgeU + edgeV + edgeW) == 2) ? 1 : 0; // two are 0, means we are a corner + float edge = ((edgeU + edgeV + edgeW) == 1) ? 1 : 0; // one of them is 0, means we are an edge + float innerarea = ((edgeU + edgeV + edgeW) == 0) ? 1 : 0; // none are 0, means we are interior + + if (innerarea != 1) { + // Note: the order of the vertices/edges we choose here can be different per application + // and depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + if (corner) { + if (U > 1.0 - edgeThreshold) + dominantVector = DV1; + else if (V > 1.0 - edgeThreshold) + dominantVector = DV2; + else if (W > 1.0 - edgeThreshold) + dominantVector = DV0; + } else { + if (edgeU) + dominantVector = lerp(DE2A, DE2B, W); + else if (edgeV) + dominantVector = lerp(DE0A, DE0B, U); + else + dominantVector = lerp(DE1A, DE1B, V); + } + } + + return dominantVector; +} + +// outside of view? +float IsClipped(float4 clipPos) { + float W = clipPos.w + DisplacementClippingBias; // bias allows artist to control to early clipping due to displacement + // Test whether the position is entirely inside the view frustum. + return (-W <= clipPos.x && clipPos.x <= W && -W <= clipPos.y && clipPos.y <= W && -W <= clipPos.z && clipPos.z <= W) ? 0.0f : 1.0f; +} + +// Compute whether all three control points along the edge are outside of the view frustum. +// By doing this, we're ensuring that +// 1.0 means clipped, 0.0 means unclipped. +float ComputeClipping(float3 cpA, float3 cpB, float3 cpC) { + // Compute the projected position for each position, then check to see whether they are clipped. + float4 projPosA = mul(float4(cpA, 1), viewPrj), projPosB = mul(float4(cpB, 1), viewPrj), projPosC = mul(float4(cpC, 1), viewPrj); + return min(min(IsClipped(projPosA), IsClipped(projPosB)), IsClipped(projPosC)); +} + +// PN Triangles and PN-AEN control points: +float3 ComputeCP(float3 posA, float3 posB, float3 normA) { + return (2.0f * posA + posB - (dot((posB - posA), normA) * normA)) / 3.0f; +} +#endif + +// Clip pixel away when opacity mask is used +void OpacityMaskClip(float2 uv) { + if (UseOpacityMaskTexture) { + float OpacityMaskMap = OpacityMaskTexture.Sample(SamplerAnisoWrap, uv).x; + + // clip value when less then 0 for punch-through alpha. + clip(OpacityMaskMap < OpacityMaskBias ? -1 : 1); + } +} + + +// Calculate a light: +struct lightOut { + float Specular; + float3 Color; +}; + +lightOut CalculateLight(bool lightEnable, int lightType, float lightAtten, float3 lightPos, float3 vertWorldPos, + float3 lightColor, float lightIntensity, float3 lightDir, float lightConeAngle, float lightFallOff, float4x4 lightViewPrjMatrix, + uniform Texture2D lightShadowMap, bool lightShadowOn, float3 vertexNormal, float3 normal, float3 diffuseColorIn, + float3 eyeVec, float roughness, float3 specularColorIn, float3 thickness, float softenMask, + float gammaCorrection, float opacity, float3 ambientOcclusion, float3 skinOcclusion, float2 screenCoord, float2 size, float scatteringRadius) { + lightOut OUT = (lightOut)0; + + OUT.Specular = 0.0; + OUT.Color = float3(0, 0, 0); + + if (lightEnable) { + // For Maya, flip the lightDir: +#ifdef _MAYA_ + lightDir = -lightDir; +#endif + + bool isAmbientLight = (lightType == 5); + if (isAmbientLight) { + OUT.Color = diffuseColorIn * lightColor * lightIntensity; + OUT.Color.rgb *= ambientOcclusion; + return OUT; + } + + bool isDirectionalLight = (lightType == 4); + float3 lightVec = lerp(lightPos - vertWorldPos, lightDir, isDirectionalLight); + + float3 L = normalize(lightVec); + + // Diffuse: + float3 diffuseDirect = float3(0, 0, 0); + float3 scatter = float3(skinCoeffX, skinCoeffY, skinCoeffZ); + diffuseDirect = PennerSkin(scatter, normal, L, vertexNormal, 1 - (scatteringRadius*skinScattering)) * diffuseColorIn; + //diffuseDirect = PennerSkinNoLUT(scatter,normal,L, vertexNormal) * diffuseColorIn; + + // Specular: + float3 specularDirect = float3(0, 0, 0); + + float3 Lobe1 = KelemenSzirmaykalos(normal, L, eyeVec, roughness, specularColorIn); + float3 Lobe2 = KelemenSzirmaykalos(normal, L, eyeVec, roughness*0.5, specularColorIn); + + specularDirect = Lobe2 * LobeMix + Lobe1 * (1 - LobeMix); + + // Light Attenuation: + bool enableAttenuation = lightAtten > 0.0001f; + float attenuation = 1.0f; + if (!isDirectionalLight) { + attenuation = lerp(1.0, 1 / pow(length(lightVec), lightAtten), enableAttenuation); + } + + // Spot light Cone Angle: + float angle = 1; + if (lightType == 2) { + angle = lightConeangle(lightConeAngle, lightFallOff, lightVec, lightDir); + } + + // Shadows: + float shadow = 1; + float3 skinShadow = float3(1, 1, 1); + float3 softShadow = float3(1, 1, 1); + if (UseShadows && lightShadowOn) { + shadow = lightShadow(lightViewPrjMatrix, lightShadowMap, vertWorldPos, screenCoord, shadowBlur, size); + + skinShadow = LutTexture.Sample(SamplerAnisoClamp, float2(shadow * angle, 1 - shadowScattering)); + skinShadow = lerp(dot(float3(0.33, 0.59, 0.11), skinShadow), skinShadow, shadowSaturation); + skinShadow = lerp(skinShadow, 1, (shadow* angle)*(shadow* angle)*(shadow* angle)); + } + + float3 lightAttenuation = lightIntensity * angle * attenuation * lightColor; + + diffuseDirect *= lightIntensity * skinShadow * attenuation * lightColor; + specularDirect *= lightAttenuation * shadow; + + float3 backScattering = float3(0, 0, 0); + if (UseTranslucency) { + half backRoughness = (1 - skinScatteringRoughness) * 128; + float3 viewScattering = exp2(saturate(dot(eyeVec, -(L + (normal * 0.01)))) * backRoughness - backRoughness) * skinScatteringAmount; + float3 lightScattering = saturate(dot(-L, normal)*0.5 + 0.5) * skinAmbientScatteringAmount; + + //float3 IBLScattering = diffuseIBL; + backScattering = (viewScattering + lightScattering) * lightAttenuation * shadow * thickness; + + float3 profile = skinScatteringOuterColor * backScattering; + backScattering = profile * skinScatteringAmount; + + + /*float scale = 2e4 * (1.0 - skinScatteringAmount) / backRoughness; + + float4 shrinkedPos = float4(vertWorldPos - 0.005 * vertexNormal, 1.0); + + float4 shadowPosition = mul(shrinkedPos, lightViewPrjMatrix); + + float d1 = lightShadowMap.Sample(SamplerShadowDepth, shadowPosition.xy / shadowPosition.w); // 'd1' has a range of 0..1 + + float d2 = shadowPosition.z; // 'd2' has a range of 0..'lightFarPlane' + d1 *= skinScatteringPlane*shadowPosition.w; // So we scale 'd1' accordingly: + float d = scale * abs(d1 - d2); + + float dd = -d * d; + float3 profile = float3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + float3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + float3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + float3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + float3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + float3(0.078, 0.0, 0.0) * exp(dd / 7.41); + backScattering = profile * saturate((0.3 + dot(L, -vertexNormal)) / 1.3) * thickness * diffuseColorIn; */ + } + + OUT.Color += diffuseDirect * skinOcclusion; + OUT.Color *= opacity; + OUT.Color += specularDirect * ambientOcclusion + backScattering; + + // Output specular and rim for opacity: + // OUT.Specular = dot(saturate(specularColor), float3(0.3f, 0.6f, 0.1f)); + } // end if light enabled + + return OUT; +} + +//------------------------------------ +// vertex shader with tessellation +//------------------------------------ +// take inputs from 3d-app +// vertex animation/skinning would happen here +SHADERDATA vt(APPDATA IN) { + SHADERDATA OUT = (SHADERDATA)0; + + // we pass vertices in world space + float4 worldPos = mul(float4(IN.position, 1), world); + OUT.worldPosition.xyz = worldPos.xyz; + +#ifdef _SUPPORTTESSELLATION_ + OUT.position = worldPos; +#else + OUT.position = float4(IN.position.xyz, 1); +#endif + + OUT.screenCoord = mul(float4(OUT.position.xyz, 1), viewPrj); + + // Pass through texture coordinates + // flip Y for Maya +#ifdef _MAYA_ + OUT.texCoord0 = float2(IN.texCoord0.x, (1.0 - IN.texCoord0.y)); + OUT.texCoord1 = float2(IN.texCoord1.x, (1.0 - IN.texCoord1.y)); + OUT.texCoord2 = float2(IN.texCoord2.x, (1.0 - IN.texCoord2.y)); +#else + OUT.texCoord0 = IN.texCoord0; + OUT.texCoord1 = IN.texCoord1; + OUT.texCoord2 = IN.texCoord2; +#endif + + // output normals in world space: + if (!SupportNonUniformScale) { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)world)); + } else { + OUT.worldNormal = normalize(mul(IN.normal, (float3x3)worldIT)); + } + + // output tangent in world space: + if (!SupportNonUniformScale) { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)world)); + } else { + OUT.worldTangent.xyz = normalize(mul(IN.tangent, (float3x3)worldIT)); + } + + // store direction for normal map: + OUT.worldTangent.w = 1; + if (dot(cross(IN.normal.xyz, IN.tangent.xyz), IN.binormal.xyz) < 0.0) { + OUT.worldTangent.w = -1; + } + + return OUT; +} + + +//------------------------------------ +// vertex shader without tessellation +//------------------------------------ +SHADERDATA v(APPDATA IN) { + SHADERDATA OUT = vt(IN); + + // If we don't use tessellation, pass vertices in clip space: +#ifdef _SUPPORTTESSELLATION_ + OUT.position = mul(float4(OUT.position.xyz, 1), viewPrj); +#else + OUT.position = mul(float4(IN.position, 1), wvp); +#endif + + return OUT; +} + +#ifdef _SUPPORTTESSELLATION_ +//------------------------------------ +// hull shader +//------------------------------------ +// executed once per control point. +// control points can be considered the original vertices of the mesh +// outputs a control point +// run parallel with hull constant function +[domain("tri")] +[partitioning("fractional_odd")] +[outputtopology("triangle_cw")] +[patchconstantfunc("HS_Constant")] +[outputcontrolpoints(3)] +[maxtessfactor(64.0)] + +// PN-AEN without displacement fix: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + +// PN Triangles, no crack fixes: +// SHADERDATA HS( InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID ) + + +// PN-AEN and displacement fix +// the index buffer is made up as follows: +// the triangle vertices index (int3) // PNAEN9 and PNAEN18 +// the 3 adjacent edges vertices index (3 * int2) // PNAEN9 and PNAEN18 +// the 3 dominant edges vertices index (3 * int2) // PNAEN18 +// the dominant position vertices index (int3) // PNAEN18 +SHADERDATA HS(InputPatch IN, uint index : SV_OutputControlPointID, uint patchID : SV_PrimitiveID) { + SHADERDATA OUT = (SHADERDATA)0; + + // copy everything first: + OUT = IN[index]; + + // Compute the next output control point ID so we know which edge we're on. + const uint nextIndex = index < 2 ? index + 1 : 0; // (index + 1) % 3 + + // PN-AEN 9 and 18: + const uint neighborIndex = 3 + 2 * index; + const uint neighborNextIndex = neighborIndex + 1; + float3 myCP, neighborCP; + + // Calculate original PN control points and neighbors'. Then average. + myCP = ComputeCP(IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + neighborCP = ComputeCP(IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldNormal); + OUT.CP1 = (myCP + neighborCP) / 2; + + myCP = ComputeCP(IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + neighborCP = ComputeCP(IN[neighborNextIndex].worldPosition, IN[neighborIndex].worldPosition, IN[neighborNextIndex].worldNormal); + OUT.CP2 = (myCP + neighborCP) / 2; + + // PN Triangles only would be: + // OUT.CP1 = ComputeCP( IN[index].worldPosition, IN[nextIndex].worldPosition, IN[index].worldNormal); + // OUT.CP2 = ComputeCP( IN[nextIndex].worldPosition, IN[index].worldPosition, IN[nextIndex].worldNormal); + + // Clipping: + OUT.clipped = ComputeClipping(OUT.worldPosition, OUT.CP1, OUT.CP2); + + // PN-AEN discontinuity code for displacement UVs: + const uint dominantEdgeIndex = 9 + 2 * index; + const uint dominantEdgeNextIndex = dominantEdgeIndex + 1; + const uint dominantVertexIndex = 15 + index; + + // Note: the order of the vertices/edges we choose here can be different per application and + // depend on how the index buffer was generated. + // These work for Maya with its PN-AEN18 primitive generator + float2 dominantEdgeUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeIndex].texCoord0, IN[dominantEdgeIndex].texCoord1, IN[dominantEdgeIndex].texCoord2); + float2 dominantEdgeNextUV = pickTexcoord(DisplacementTexcoord, IN[dominantEdgeNextIndex].texCoord0, IN[dominantEdgeNextIndex].texCoord1, IN[dominantEdgeNextIndex].texCoord2); + float2 dominantVertexUV = pickTexcoord(DisplacementTexcoord, IN[dominantVertexIndex].texCoord0, IN[dominantVertexIndex].texCoord1, IN[dominantVertexIndex].texCoord2); + + OUT.dominantEdge = float4(dominantEdgeNextUV, dominantEdgeUV); + OUT.dominantVertex = dominantVertexUV; + + // VDM dominant normal and tangent for displacement crack fix: + OUT.dominantNormalE0 = IN[dominantEdgeNextIndex].worldNormal.xyz; + OUT.dominantNormalE1 = IN[dominantEdgeIndex].worldNormal.xyz; + OUT.dominantNormalCorner = IN[dominantVertexIndex].worldNormal.xyz; + + OUT.dominantTangentE0 = IN[dominantEdgeNextIndex].worldTangent.xyz; + OUT.dominantTangentE1 = IN[dominantEdgeIndex].worldTangent.xyz; + OUT.dominantTangentCorner = IN[dominantVertexIndex].worldTangent.xyz; + + return OUT; +} + +//------------------------------------ +// Hull shader constant function +//------------------------------------ +// executed once per patch +// outputs user defined data per patch and tessellation factor +// calculates control points for vertex and normal and passes to domain +// This hull shader passes the tessellation factors through to the HW tessellator, +// run parallel with hull function +HSCONSTANTDATA HS_Constant(const OutputPatch IN, uint patchID : SV_PrimitiveID) { + HSCONSTANTDATA OUT = (HSCONSTANTDATA)0; + + // future todo: + // triangle is on silhouette? + // triangle is facing camera? If facing backwards, reduce tessellation + // triangle lies in high frequency area of displacement map (density-based tessellation)? + + // Now setup the PNTriangle control points... + // Center control point + float3 f3E = (IN[0].CP1 + IN[0].CP2 + IN[1].CP1 + IN[1].CP2 + IN[2].CP1 + IN[2].CP2) / 6.0f; + float3 f3V = (IN[0].worldPosition + IN[1].worldPosition + IN[2].worldPosition) / 3.0f; + OUT.CPCenter = f3E + ((f3E - f3V) / 2.0f); + + // Clipping: + float4 centerViewPos = mul(float4(OUT.CPCenter, 1), viewPrj); + bool centerClipped = IsClipped(centerViewPos); + + if (IN[0].clipped && IN[1].clipped && IN[2].clipped && centerClipped) { + // If all control points are clipped, the surface cannot possibly be visible. + // Not entirely true, because displacement mapping can make them visible in the domain shader + // so we provide the user with a bias factor to avoid clipping too early + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = 0; + } else { + // Camera based tessellation, per object. So very basic. + float3 CameraPosition = viewInv[3].xyz; + float LengthOp = length((CameraPosition - world[3].xyz)); + float DivOp = (TessellationRange / LengthOp); + float MaxOp = max(TessellationMin + DivOp, 1); + OUT.TessFactor[0] = OUT.TessFactor[1] = OUT.TessFactor[2] = MaxOp; + } + + // Inside tess factor is just the average of the edge factors + OUT.InsideTessFactor = (OUT.TessFactor[0] + OUT.TessFactor[1] + OUT.TessFactor[2]) / 3.0f; + + return OUT; +} + +//------------------------------------ +// domain shader +//------------------------------------ +// outputs the new vertices based on previous tessellation. +// also calculates new normals and uvs +// This domain shader applies contol point weighting to the barycentric coords produced by the FF tessellator +// If you wanted to do any vertex lighting, it would have to happen here. +[domain("tri")] +SHADERDATA DS(HSCONSTANTDATA HSIN, OutputPatch IN, float3 f3BarycentricCoords : SV_DomainLocation) { + SHADERDATA OUT = (SHADERDATA)0; + + // The barycentric coordinates + float fU = f3BarycentricCoords.x; + float fV = f3BarycentricCoords.y; + float fW = f3BarycentricCoords.z; + + // Precompute squares and squares * 3 + float fUU = fU * fU; + float fVV = fV * fV; + float fWW = fW * fW; + float fUU3 = fUU * 3.0f; + float fVV3 = fVV * 3.0f; + float fWW3 = fWW * 3.0f; + + // PN position: + float3 position = IN[0].worldPosition * fWW * fW + + IN[1].worldPosition * fUU * fU + + IN[2].worldPosition * fVV * fV + + IN[0].CP1 * fWW3 * fU + + IN[0].CP2 * fW * fUU3 + + IN[2].CP2 * fWW3 * fV + + IN[1].CP1 * fUU3 * fV + + IN[2].CP1 * fW * fVV3 + + IN[1].CP2 * fU * fVV3 + + HSIN.CPCenter * 6.0f * fW * fU * fV; + + // Flat position: + float3 flatPosition = IN[0].worldPosition * fW + IN[1].worldPosition * fU + IN[2].worldPosition * fV; + + // allow user to blend between PN tessellation and flat tessellation: + position = lerp(position, flatPosition, FlatTessellation); + + // Interpolate normal + float3 normal = IN[0].worldNormal * fW + IN[1].worldNormal * fU + IN[2].worldNormal * fV; + + // Normalize the interpolated normal + OUT.worldNormal = normalize(normal); + + // Compute tangent: + float3 tangent = IN[0].worldTangent.xyz * fW + IN[1].worldTangent.xyz * fU + IN[2].worldTangent.xyz * fV; + OUT.worldTangent.xyz = normalize(tangent.xyz); + + // Pass through the direction of the binormal as calculated in the vertex shader + OUT.worldTangent.w = IN[0].worldTangent.w; + + // Linear interpolate the texture coords + OUT.texCoord0 = IN[0].texCoord0 * fW + IN[1].texCoord0 * fU + IN[2].texCoord0 * fV; + OUT.texCoord1 = IN[0].texCoord1 * fW + IN[1].texCoord1 * fU + IN[2].texCoord1 * fV; + OUT.texCoord2 = IN[0].texCoord2 * fW + IN[1].texCoord2 * fU + IN[2].texCoord2 * fV; + + // apply displacement map (only when not rendering the Maya preview swatch): + if (UseDisplacementMap && !IsSwatchRender) { + // Fix Displacement Seams. + // we assume here that the displacement UVs is UVset 0. + // if this UVset index is changed, it should als be changed in the hull shader + // PN-AEN 18 with displacement UV seam fix + float2 displaceUV = pickTexcoord(DisplacementTexcoord, OUT.texCoord0, OUT.texCoord1, OUT.texCoord2); + float3 displacementUVW = PickDominant(float3(displaceUV, 0), fU, fV, fW, + float3(IN[0].dominantEdge.xy, 0), float3(IN[0].dominantEdge.zw, 0), + float3(IN[1].dominantEdge.xy, 0), float3(IN[1].dominantEdge.zw, 0), + float3(IN[2].dominantEdge.xy, 0), float3(IN[2].dominantEdge.zw, 0), + float3(IN[0].dominantVertex.xy, 0), + float3(IN[1].dominantVertex.xy, 0), + float3(IN[2].dominantVertex.xy, 0)); + + // We can still get cracks here because the world tangent and normal may be different for vertices on each side of the UV seam, + // because we do the tangent to world conversion, we get the same diplacement amount, but it results in different movement once converted to world space. + // And even a tiny difference between normal or tangent will cause large cracks. + float3 displacementNormal = PickDominant(OUT.worldNormal, + fU, fV, fW, + IN[0].dominantNormalE0, IN[0].dominantNormalE1, + IN[1].dominantNormalE0, IN[1].dominantNormalE1, + IN[2].dominantNormalE0, IN[2].dominantNormalE1, + IN[0].dominantNormalCorner, + IN[1].dominantNormalCorner, + IN[2].dominantNormalCorner); + + displacementNormal = normalize(displacementNormal); + + if (DisplacementModel == 1) { // Tangent Vector Displacement + float3 displacementTangent = PickDominant(OUT.worldTangent.xyz, fU, fV, fW, + IN[0].dominantTangentE0, IN[0].dominantTangentE1, + IN[1].dominantTangentE0, IN[1].dominantTangentE1, + IN[2].dominantTangentE0, IN[2].dominantTangentE1, + IN[0].dominantTangentCorner, + IN[1].dominantTangentCorner, + IN[2].dominantTangentCorner); + + displacementTangent = normalize(displacementTangent); + + float3 vecDisp = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).xyz; + vecDisp -= DisplacementOffset; + + float3 Bn = cross(displacementNormal, displacementTangent); + float3x3 toWorld = float3x3(displacementTangent, Bn.xyz, displacementNormal); + + float3 VDMcoordSys = vecDisp.xzy; // Mudbox + if (VectorDisplacementCoordSys == 1) { + VDMcoordSys = vecDisp.xyz; // Maya or ZBrush + } + + float3 vecDispW = mul(VDMcoordSys, toWorld) * DisplacementHeight; + position.xyz += vecDispW; + } else { + // offset (-0.5) so that we can have negative displacement also + float offset = DisplacementTexture.SampleLevel(SamplerAnisoWrap, displacementUVW.xy, 0).x - DisplacementOffset; + position.xyz += displacementNormal * offset * DisplacementHeight; + } + } + + // Update World Position value for inside pixel shader: + OUT.worldPosition = position.xyz; + + // Transform model position with view-projection matrix + //OUT.position = float4(position.xyz, 1); // with geo + OUT.position = mul(float4(position.xyz, 1), viewPrj); // without geo + + return OUT; +} + +//------------------------------------ +// Geometry Shader +//------------------------------------ +// This is a sample Geo shader. Disabled in this shader, but left here for your reference. +// If you wish to enable it, search for 'with geo' in this shader for code to change. +[maxvertexcount(3)] // Declaration for the maximum number of vertices to create +void GS(triangle SHADERDATA IN[3], inout TriangleStream TriStream) { + SHADERDATA OUT; + + // quick test to see if geo also works: + for (int i = 0; i<3; ++i) { + OUT = IN[i]; + OUT.position = mul(mul(float4(OUT.position.xyz, 1), view), prj); + TriStream.Append(OUT); + } + TriStream.RestartStrip(); // end triangle +} +#endif + +void sampleMasks() { + +} + +//------------------------------------ +// pixel shader +//------------------------------------ +float4 f(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) : SV_Target { +#ifdef _3DSMAX_ + FrontFace = !FrontFace; +#endif + // clip are early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float gammaCorrection = lerp(1.0, 2.2, LinearSpaceLighting); + + float3 N = normalize(IN.worldNormal.xyz); + if (flipBackfaceNormals) { + N = lerp(-N, N, FrontFace); + } + float3 Nw = N; + + // Tangent and BiNormal: + float3 T = normalize(IN.worldTangent.xyz); + float3 Bn = cross(N, T); + Bn *= IN.worldTangent.w; + + float4 diffuse = float4(1, 1, 1, 1); + if (UseDiffuseTexture) { + float2 diffuseUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 diffuseTextureSample = DiffuseTexture.Sample(SamplerAnisoWrap, diffuseUV); + + if (UseDiffuseTextureAlpha) { + diffuse.a = diffuseTextureSample.a; + } + + diffuse.rgb *= pow(diffuseTextureSample.rgb, gammaCorrection); + } + + float3 microNormal = float3(0, 0, 1); + if (UseNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(NormalTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 NormalMap = NormalTexture.Sample(SamplerAnisoWrap, normalUV).xyz * 2.0 - 1.0; + float3 backupNormal = NormalMap; + + if (NormalCoordsysX > 0) + NormalMap.x = -NormalMap.x; + if (NormalCoordsysY > 0) + NormalMap.y = -NormalMap.y; + + NormalMap.xy *= NormalHeight; + + if (UseMicroNormalTexture) { + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + NormalMap.xy += microNormal.xy; + } + + if (UseBlendTexture) { + float2 blendUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + + + + + + + } + NormalMap = mul(NormalMap.xyz, toWorld); + N = normalize(NormalMap); + } else { + if (UseMicroNormalTexture) { + float3x3 toWorld = float3x3(T, Bn, N); + + float2 normalUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + microNormal = MicroNormalTexture.Sample(SamplerAnisoWrap, normalUV * MicroScale).xyz * 2.0 - 1.0; + + microNormal.xy *= MicroNormalHeight; + microNormal = mul(microNormal.xyz, toWorld); + } + } + + diffuse.rgb *= DiffuseColor; + + float3 blurredNormal = lerp(N, Nw, NormalBlurring); + + float3 V = normalize(viewInv[3].xyz - IN.worldPosition.xyz); + + float4 specular = float4(0.028, 0.028, 0.028, 1); + specular.rgb *= SpecularColor; + + if (UseSpecularTexture) { + float2 opacityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 SpecularTextureSample = SpecularTexture.Sample(SamplerAnisoWrap, opacityUV); + + specular.rgb *= pow(SpecularTextureSample.rgb, gammaCorrection); + + if (UseSpecularTextureAlpha) { + specular.a = SpecularTextureSample.a; + } + } + + float cavity = 1; + if (UseCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float CavityTextureSample = CavityTexture.Sample(SamplerAnisoWrap, cavityUV); + + cavity = lerp(1, pow(CavityTextureSample, gammaCorrection), CavityAmount); + } + + float microCavity = 1; + if (UseMicroCavityTexture) { + float2 cavityUV = pickTexcoord(SpecularTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float MicroCavityTextureSample = MicroCavityTexture.Sample(SamplerAnisoWrap, cavityUV * MicroScale); + + microCavity = lerp(1, pow(MicroCavityTextureSample, gammaCorrection), MicroCavityAmount); + } + + specular.rgb *= cavity * microCavity; // We apply cavity on the specular before it is sent to the fresnel + + float roughness = Roughness; + if (UseSpecularTextureAlpha) { + roughness *= specular.a; + } + + float scatteringRadius = 1; + if (UseScatteringRadiusTexture) { + float2 scatteringUV = pickTexcoord(DiffuseTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float4 scatteringRadiusTextureSample = ScatteringRadiusTexture.Sample(SamplerAnisoWrap, scatteringUV); + + scatteringRadius *= pow(scatteringRadiusTextureSample, gammaCorrection); + } + + // Opacity: + float opacity = saturate(diffuse.a * Opacity); + + // Occlusion: + float3 ambientOcclusion = float3(1, 1, 1); + if (UseAmbientOcclusionTexture) { + float2 aomapUV = pickTexcoord(OcclusionTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + float3 aomapTextureSample = OcclusionTexture.Sample(SamplerAnisoWrap, aomapUV).rgb; + ambientOcclusion *= lerp(1, pow(aomapTextureSample.rgb, gammaCorrection), OcclusionAmount); + } + + float3 thickness = float3(1, 1, 1); + if (UseThicknessTexture) { + float2 thicknessUV = pickTexcoord(ThicknessTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + thickness = pow(BackScatteringThicknessTexture.Sample(SamplerAnisoWrap, thicknessUV), gammaCorrection).xyz; + } + + float3 skinOcclusion = coloredOcclusion(diffuse, ambientOcclusion); // Colored occlusion for skin + + float softenMask = 1.0f; + + float2 screenCoord = IN.screenCoord.xy / IN.screenCoord.w; + //float2 currentScreenSize = screenSize; // TO DO FIND A WAY TO GET SCREEN SIZE, MAYA BUG ? + float2 currentScreenSize = float2(1024, 512); + + // -------- + // LIGHTS: + // -------- + // future todo: Maya could pass light info in array so we can loop any number of lights. + + // light 0: + lightOut light0 = CalculateLight(light0Enable, light0Type, light0AttenScale, light0Pos, IN.worldPosition.xyz, + light0Color, light0Intensity, light0Dir, light0ConeAngle, light0FallOff, light0Matrix, + light0ShadowMap, light0ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 1: + lightOut light1 = CalculateLight(light1Enable, light1Type, light1AttenScale, light1Pos, IN.worldPosition.xyz, + light1Color, light1Intensity, light1Dir, light1ConeAngle, light1FallOff, light1Matrix, + light1ShadowMap, light1ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + // light 2: + lightOut light2 = CalculateLight(light2Enable, light2Type, light2AttenScale, light2Pos, IN.worldPosition.xyz, + light2Color, light2Intensity, light2Dir, light2ConeAngle, light2FallOff, light2Matrix, + light2ShadowMap, light2ShadowOn, blurredNormal, N, diffuse, V, roughness, specular, + thickness, softenMask, gammaCorrection, opacity, ambientOcclusion, skinOcclusion, screenCoord, currentScreenSize, scatteringRadius); + + float3 lightTotal = light0.Color + light1.Color + light2.Color; + + + // ---------------------- + // IMAGE BASED LIGHTING + // ---------------------- + + // Specular IBL + float3 specularIBL = float3(0, 0, 0); + bool reflectMapUsed = UseSpecCubeIBL; + if (reflectMapUsed) { + int lod = 7; // Hard coded mip map level + + float3 reflectionVector = reflect(-V, N); + + reflectionVector = RotateVectorYaw(reflectionVector, SkyRotation); + reflectionVector = normalize(reflectionVector); + float NdotV = saturate(dot(N, V)); + float3 F = F_LagardeSchlick(specular, 1 - roughness, NdotV); + + specularIBL += SpecularCubeIBL.SampleLevel(CubeMapSampler, reflectionVector, lod * roughness).rgb * F; + } + + // Diffuse IBL + float3 diffuseIBL = float3(0, 0, 0); + bool useDiffuseIBL = UseDiffuseIBLMap; + if (useDiffuseIBL) { + // We use the world normal to sample the lighting texture + float3 diffuseIBLVec_High = N; + float3 diffuseIBLVec_Low = blurredNormal; + + diffuseIBLVec_High = RotateVectorYaw(diffuseIBLVec_High, SkyRotation); + diffuseIBLVec_High = normalize(diffuseIBLVec_High); + + diffuseIBLVec_Low = RotateVectorYaw(diffuseIBLVec_Low, SkyRotation); + diffuseIBLVec_Low = normalize(diffuseIBLVec_Low); + + float3 diffuseIBL_High = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_High, 0).rgb; + float3 diffuseIBL_Low = DiffuseCubeIBL.SampleLevel(CubeMapSampler, diffuseIBLVec_Low, 0).rgb; + + diffuseIBL = diffuseSkinIBL(float3(skinCoeffX, skinCoeffY, skinCoeffZ), diffuseIBL_High, diffuseIBL_Low); + } + + // ---------------------- + // FINAL COLOR AND ALPHA: + // ---------------------- + + float3 result = float3(0, 0, 0); + + result += diffuse * diffuseIBL * DiffuseIBLIntensity * skinOcclusion; + + result += specularIBL * SpecularIBLIntensity * specularOcclusion(N, V, ambientOcclusion); + + result += lightTotal; + + //result = N; + + // do gamma correction in shader: + if (!MayaFullScreenGamma) + result = pow(result, 1 / gammaCorrection); + + // final alpha: + float transparency = opacity; + transparency = saturate(transparency); // keep 0-1 range + + return float4(result, transparency); +} + + +#ifdef _MAYA_ +void Peel(SHADERDATA IN) { + float currZ = abs(mul(float4(IN.worldPosition, 1.0f), view).z); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + float2 UV = Pndc.xy / Pndc.w * float2(0.5f, -0.5f) + 0.5f; + float prevZ = transpDepthTexture.Sample(SamplerShadowDepth, UV).r; + float opaqZ = opaqueDepthTexture.Sample(SamplerShadowDepth, UV).r; + float bias = 0.00002f; + + if (currZ < prevZ * (1.0f + bias) || currZ > opaqZ * (1.0f - bias)) { + discard; + } +} + +float4 LinearDepth(SHADERDATA IN) { + return abs(mul(float4(IN.worldPosition, 1.0f), view).z); +} + +float4 DepthComplexity(float opacity) { + return opacity > 0.001f ? 1.0f : 0.0f; +} + +struct MultiOut2 { + float4 target0 : SV_Target0; + float4 target1 : SV_Target1; +}; + +MultiOut2 fTransparentPeel(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = LinearDepth(IN); + return OUT; +} + +MultiOut2 fTransparentPeelAndAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + Peel(IN); + + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +MultiOut2 fTransparentWeightedAvg(SHADERDATA IN, bool FrontFace : SV_IsFrontFace) { + MultiOut2 OUT; + OUT.target0 = f(IN, FrontFace); + OUT.target1 = DepthComplexity(OUT.target0.w); + return OUT; +} + +//------------------------------------ +// wireframe pixel shader +//------------------------------------ +float4 fwire(SHADERDATA IN) : SV_Target { + return float4(0, 0, 1, 1); +} + + +//------------------------------------ +// pixel shader for shadow map generation +//------------------------------------ +//float4 ShadowMapPS( float3 Pw, float4x4 shadowViewProj ) +float4 ShadowMapPS(SHADERDATA IN) : SV_Target { + // clip as early as possible + float2 opacityMaskUV = pickTexcoord(OpacityMaskTexcoord, IN.texCoord0, IN.texCoord1, IN.texCoord2); + OpacityMaskClip(opacityMaskUV); + + float4 Pndc = mul(float4(IN.worldPosition, 1.0f), viewPrj); + + // divide Z and W component from clip space vertex position to get final depth per pixel + float retZ = Pndc.z / Pndc.w; + + retZ += fwidth(retZ); + return retZ.xxxx; +} +#endif + +//----------------------------------- +// Objects without tessellation +//------------------------------------ +technique11 TessellationOFF < + bool overridesDrawState = false; // we do not supply our own render state settings + int isTransparent = 3; + // objects with clipped pixels need to be flagged as isTransparent to avoid the occluding underlying geometry since Maya renders the object with flat shading when computing depth + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + // 'VariableNameAsAttributeName = false' can be used to tell Maya's DX11ShaderNode to use the UIName annotation string for the Maya attribute name instead of the shader variable name. + // When changing this option, the attribute names generated for the shader inside Maya will change and this can have the side effect that older scenes have their shader attributes reset to default. + // bool VariableNameAsAttributeName = false; + +#ifdef _MAYA_ + // Tells Maya that the effect supports advanced transparency algorithm, + // otherwise Maya would render the associated objects simply by alpha + // blending on top of other objects supporting advanced transparency + // when the viewport transparency algorithm is set to depth-peeling or + // weighted-average. + bool supportsAdvancedTransparency = true; +#endif +> +{ + pass p0 < string drawContext = "colorPass"; > { // tell maya during what draw context this shader should be active, in this case 'Color' + // even though overrideDrawState is false, we still set the pre-multiplied alpha state here in + // case Maya is using 'Depth Peeling' transparency algorithm + // This unfortunately won't solve sorting issues, but at least our object can draw transparent. + // If we don't set this, the object will always be opaque. + // In the future, hopefully ShaderOverride nodes can participate properly in Maya's Depth Peeling setup +#ifdef _MAYA_ + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); +#endif + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, f())); + } + +#ifdef _MAYA_ + pass pTransparentPeel < string drawContext = "transparentPeel"; > { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, v())); + SetHullShader(NULL); + SetDomainShader(NULL); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +#endif +} + +#ifdef _SUPPORTTESSELLATION_ +//----------------------------------- +// Objects with tessellation +//------------------------------------ +// Vertex Index Buffer options: +// index_buffer_type: None; // no divergent normals and no displacement crack fix +// index_buffer_type: PNAEN9; // divergent normals crack fix; no displacement UV seam crack fix +// index_buffer_type: PNAEN18, // crack fix for divergent normals and UV seam displacement +technique11 TessellationON < + string index_buffer_type = "PNAEN18"; // tell Maya what type of index buffer we want. Must be unique name per generator + bool overridesDrawState = false; + int isTransparent = 3; + string transparencyTest = "Opacity < 1.0 || (UseDiffuseTexture && UseDiffuseTextureAlpha) || UseOpacityMaskTexture"; + bool supportsAdvancedTransparency = true; > { + pass p0 < string drawContext = "colorPass"; > { + SetBlendState(PMAlphaBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, f())); + } + + pass pTransparentPeel < string drawContext = "transparentPeel";> { // Depth-peeling pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeel())); + } + + pass pTransparentPeelAndAvg < string drawContext = "transparentPeelAndAvg"; > { // Weighted-average pass for depth-peeling transparency algorithm. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentPeelAndAvg())); + } + + pass pTransparentWeightedAvg < string drawContext = "transparentWeightedAvg"; > { // Weighted-average algorithm. No peeling. + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, fTransparentWeightedAvg())); + } + + pass pShadow < string drawContext = "shadowPass"; > { + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); + SetPixelShader(CompileShader(ps_5_0, ShadowMapPS())); + } +} + +//----------------------------------- +// Wireframe +//------------------------------------ +technique11 WireFrame < + string index_buffer_type = "PNAEN18"; + bool overridesDrawState = false; // since we only change the fillMode, it can remain on false. If we changed the blend state, it would have to be true + int isTransparent = 0; > { + pass p0 < string drawContext = "colorPass"; > { + SetRasterizerState(WireframeCullFront); + SetVertexShader(CompileShader(vs_5_0, vt())); + SetHullShader(CompileShader(hs_5_0, HS())); + SetDomainShader(CompileShader(ds_5_0, DS())); + SetGeometryShader(NULL); // without geo + //SetGeometryShader( CompileShader(gs_5_0, GS()) ); // with geo + SetPixelShader(CompileShader(ps_5_0, fwire())); + } +} +#endif diff --git a/dna_calibration.mod b/dna_calibration.mod index 17e0bb58..96b4da37 100644 --- a/dna_calibration.mod +++ b/dna_calibration.mod @@ -21,3 +21,15 @@ PYTHONPATH +:= PYTHONPATH +:= data PYTHONPATH +:= lib/Maya2023/linux MAYA_PLUG_IN_PATH +:= lib/Maya2023/linux + ++ MAYAVERSION:2024 PLATFORM:win64 MetaHuman-DNA-Calibration any . +PYTHONPATH +:= +PYTHONPATH +:= data +PYTHONPATH +:= lib/Maya2024/windows +MAYA_PLUG_IN_PATH +:= lib/Maya2024/windows + ++ MAYAVERSION:2024 PLATFORM:linux MetaHuman-DNA-Calibration any . +PYTHONPATH +:= +PYTHONPATH +:= data +PYTHONPATH +:= lib/Maya2024/linux +MAYA_PLUG_IN_PATH +:= lib/Maya2024/linux diff --git a/dnacalib/CMakeLists.txt b/dnacalib/CMakeLists.txt index 8af5dd69..4ae91f05 100644 --- a/dnacalib/CMakeLists.txt +++ b/dnacalib/CMakeLists.txt @@ -3,7 +3,25 @@ project(dnacalib) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModulesExtra") +enable_testing() + add_subdirectory(DNACalib) add_subdirectory(SPyUS) add_subdirectory(PyDNA) add_subdirectory(PyDNACalib) + +################################################ +# Package build artifacts +set(CPACK_GENERATOR "ZIP") +set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) +set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY OFF) +set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE) +string(CONCAT CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}" + "-${CMAKE_PROJECT_VERSION}" + "-${CMAKE_SYSTEM_NAME}" + "-${CMAKE_SYSTEM_PROCESSOR}" + "-${CMAKE_CXX_COMPILER_ID}${CMAKE_CXX_COMPILER_VERSION}" + "-${CMAKE_BUILD_TYPE}" + "-${PYTHON3_EXACT_VERSION}" + "-SHARED") +include(CPack) diff --git a/dnacalib/CMakeModulesExtra/install/InstallLibrary.cmake b/dnacalib/CMakeModulesExtra/install/InstallLibrary.cmake index 4aa4816d..d0659f86 100644 --- a/dnacalib/CMakeModulesExtra/install/InstallLibrary.cmake +++ b/dnacalib/CMakeModulesExtra/install/InstallLibrary.cmake @@ -14,6 +14,14 @@ set(INSTALL_LIBRARY_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}") macro(install_library target_name) + # component_name is an optional argument, and will default to the given target_name + set(COMPONENT_NAME ${target_name}) + set(extra_args ${ARGN}) + list(LENGTH extra_args num_extra_args) + if(${num_extra_args} GREATER 0) + list(GET extra_args 0 COMPONENT_NAME) + endif() + include(GNUInstallDirs) set(REPRESENTATIVE_TARGET_NAME ${target_name}) set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) @@ -21,9 +29,20 @@ macro(install_library target_name) # Set install destinations and associate installed target files with an export install(TARGETS ${REPRESENTATIVE_TARGET_NAME} EXPORT ${PROJECT_NAME}-targets - RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT ${COMPONENT_NAME} + RUNTIME + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT ${COMPONENT_NAME} + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT ${COMPONENT_NAME} + NAMELINK_COMPONENT ${COMPONENT_NAME} + ARCHIVE + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT ${COMPONENT_NAME} + PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${COMPONENT_NAME} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) # Write build-tree targets @@ -37,7 +56,8 @@ macro(install_library target_name) install(EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}Targets.cmake NAMESPACE ${PROJECT_NAME}:: - DESTINATION ${INSTALL_CONFIGDIR}) + DESTINATION ${INSTALL_CONFIGDIR} + COMPONENT ${COMPONENT_NAME}) include(CMakePackageConfigHelpers) @@ -68,13 +88,17 @@ macro(install_library target_name) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.install.cmake" DESTINATION ${INSTALL_CONFIGDIR} - RENAME "${PROJECT_NAME}Config.cmake") + RENAME "${PROJECT_NAME}Config.cmake" + COMPONENT ${COMPONENT_NAME}) # Install package version file install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" - DESTINATION ${INSTALL_CONFIGDIR}) + DESTINATION ${INSTALL_CONFIGDIR} + COMPONENT ${COMPONENT_NAME}) # Install include files - install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + install(DIRECTORY include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT ${COMPONENT_NAME}) endmacro() diff --git a/dnacalib/DNACalib/CMakeLists.txt b/dnacalib/DNACalib/CMakeLists.txt index e23730e1..f76450e7 100644 --- a/dnacalib/DNACalib/CMakeLists.txt +++ b/dnacalib/DNACalib/CMakeLists.txt @@ -100,6 +100,8 @@ set(SOURCES src/dnacalib/TypeDefs.h src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp + src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.cpp + src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h src/dnacalib/commands/ClearBlendShapesCommand.cpp src/dnacalib/commands/CommandSequence.cpp src/dnacalib/commands/PruneBlendShapeTargetsCommand.cpp diff --git a/dnacalib/DNACalib/cmake/DNACDependencies.cmake b/dnacalib/DNACalib/cmake/DNACDependencies.cmake index e7d11a36..123e46dc 100644 --- a/dnacalib/DNACalib/cmake/DNACDependencies.cmake +++ b/dnacalib/DNACalib/cmake/DNACDependencies.cmake @@ -123,6 +123,8 @@ set(SOURCES src/dnacalib/CommandImplBase.h src/dnacalib/TypeDefs.h src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp + src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.cpp + src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h src/dnacalib/commands/ClearBlendShapesCommand.cpp src/dnacalib/commands/CommandSequence.cpp src/dnacalib/commands/PruneBlendShapeTargetsCommand.cpp diff --git a/dnacalib/DNACalib/include/dna/types/ArrayView.h b/dnacalib/DNACalib/include/dna/types/ArrayView.h index a6e8748c..4d163e66 100644 --- a/dnacalib/DNACalib/include/dna/types/ArrayView.h +++ b/dnacalib/DNACalib/include/dna/types/ArrayView.h @@ -41,12 +41,19 @@ struct ArrayViewTraits { using difference_type = std::ptrdiff_t; }; +template +struct IsCompatible { + static constexpr bool value = std::is_same::type, typename std::remove_cv::type>::value && + (std::is_const::type>::value || + !std::is_const::type>::value); +}; + /** @brief A view over a continuous sequence of objects. @tparam T element type Provides a view over a continuous sequence of objects owned by some other object. Contains a count of elements and a pointer to a location where they are stored. - ArrayView does not own the mmemory it points to - it does not perform any allocation + ArrayView does not own the memory it points to - it does not perform any allocation and deallocation. It can be constructed given a pointer and element count, or a container type argument. The class provides helper methods for creating subviews over the objects, and methods for by-value comparison with containers. ConstArrayView represents an immutable view. @@ -76,23 +83,23 @@ class ArrayView { sz{size} { } - ArrayView(std::nullptr_t /*unused*/, size_type /*unused*/) : ArrayView{nullptr, {}} { - } - - template + template::value, int>::type = 0> ArrayView(ArrayView& src) : ArrayView{src.data(), src.size()} { } - template + template::value, int>::type = 0> ArrayView(const ArrayView& src) : ArrayView{src.data(), src.size()} { } - template + template::value, int>::type = 0> ArrayView(ArrayView&& src) : ArrayView{src.data(), src.size()} { } - template::value, int>::type = 0> - explicit ArrayView(U&& src) : ArrayView{src.data(), src.size()} { + template::value && + IsCompatible::type::value_type>::value, + int>::type = 0> + ArrayView(U&& src) : ArrayView{src.data(), static_cast(src.size())} { } size_type size() const { @@ -193,7 +200,8 @@ bool operator!=(const ArrayView& lhs, const ArrayView& rhs) { } template -bool operator==(const ArrayView& lhs, const TContainer& rhs) { +typename std::enable_if, TContainer>::value, bool>::type operator==(const ArrayView& lhs, + const TContainer& rhs) { if (lhs.size() != rhs.size()) { return false; } @@ -207,17 +215,20 @@ bool operator==(const ArrayView& lhs, const TContainer& rhs) { } template -bool operator!=(const ArrayView& lhs, const TContainer& rhs) { +typename std::enable_if, TContainer>::value, bool>::type operator!=(const ArrayView& lhs, + const TContainer& rhs) { return !(lhs == rhs); } template -bool operator==(const TContainer& lhs, const ArrayView& rhs) { +typename std::enable_if, TContainer>::value, bool>::type operator==(const TContainer& lhs, + const ArrayView& rhs) { return (rhs == lhs); } template -bool operator!=(const TContainer& lhs, const ArrayView& rhs) { +typename std::enable_if, TContainer>::value, bool>::type operator!=(const TContainer& lhs, + const ArrayView& rhs) { return !(lhs == rhs); } diff --git a/dnacalib/DNACalib/include/dna/types/StringView.h b/dnacalib/DNACalib/include/dna/types/StringView.h index 653a0e63..c573dc5f 100644 --- a/dnacalib/DNACalib/include/dna/types/StringView.h +++ b/dnacalib/DNACalib/include/dna/types/StringView.h @@ -32,12 +32,4 @@ class StringView : public trust::ConstArrayView { }; -inline bool operator==(const StringView& lhs, const StringView& rhs) { - return (static_cast(lhs) == static_cast(rhs)); -} - -inline bool operator!=(const StringView& lhs, const StringView& rhs) { - return !(lhs == rhs); -} - } // namespace dna diff --git a/dnacalib/DNACalib/src/dna/filters/JointFilter.cpp b/dnacalib/DNACalib/src/dna/filters/JointFilter.cpp index 8316acd3..f2a2bcc0 100644 --- a/dnacalib/DNACalib/src/dna/filters/JointFilter.cpp +++ b/dnacalib/DNACalib/src/dna/filters/JointFilter.cpp @@ -70,7 +70,7 @@ void JointFilter::apply(RawBehavior& dest) { } } // Collect row indices of removed output indices to be used for joint delta removal - Set rowsToDelete{memRes}; + UnorderedSet rowsToDelete{memRes}; // Remove output indices belonging to the deletable joint extd::filter(jointGroup.outputIndices, [this, &rowsToDelete](std::uint16_t outputIndex, std::size_t rowIndex) { const auto jointIndex = static_cast(outputIndex / jointAttributeCount); diff --git a/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp index fc0fb865..52b7ef43 100644 --- a/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp +++ b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommand.cpp @@ -3,11 +3,26 @@ #include "dnacalib/commands/CalculateMeshLowerLODsCommand.h" #include "dnacalib/CommandImplBase.h" +#include "dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h" #include "dnacalib/dna/DNA.h" #include "dnacalib/dna/DNACalibDNAReaderImpl.h" #include "dnacalib/types/Aliases.h" #include "dnacalib/types/UVBarycentricMapping.h" +#ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable : 4365 4987) +#endif +#include +#include +#include +#include +#include +#ifdef _MSC_VER + #pragma warning(pop) +#endif + + namespace dnac { class CalculateMeshLowerLODsCommand::Impl : public CommandImplBase { @@ -25,7 +40,16 @@ class CalculateMeshLowerLODsCommand::Impl : public CommandImplBase { } void run(DNACalibDNAReaderImpl* output) { - UVBarycentricMapping mapping{output, meshIndex, getMemoryResource()}; + auto faceGetter = std::bind(&dna::Reader::getFaceVertexLayoutIndices, output, meshIndex, std::placeholders::_1); + const auto layoutPositions = output->getVertexLayoutPositionIndices(meshIndex); + const auto layoutTexCoords = output->getVertexLayoutTextureCoordinateIndices(meshIndex); + const auto origMappingUs = output->getVertexTextureCoordinateUs(meshIndex); + const auto mappingVs = output->getVertexTextureCoordinateVs(meshIndex); + const auto mappingUs = deduplicateTextureCoordinates(origMappingUs, mappingVs); + const auto faceCount = output->getFaceCount(meshIndex); + + UVBarycentricMapping mapping{faceGetter, layoutPositions, layoutTexCoords, mappingUs, mappingVs, faceCount, + getMemoryResource()}; auto srcMeshXs = output->getVertexPositionXs(meshIndex); auto srcMeshYs = output->getVertexPositionYs(meshIndex); @@ -36,51 +60,83 @@ class CalculateMeshLowerLODsCommand::Impl : public CommandImplBase { }; for (std::uint16_t mi : findIndicesOfMeshLowerLODs(output)) { - auto vertexLayoutPositionIndices = output->getVertexLayoutPositionIndices(mi); - auto vertexLayoutTextureCoordinateIndices = output->getVertexLayoutTextureCoordinateIndices(mi); - auto us = output->getVertexTextureCoordinateUs(mi); - auto vs = output->getVertexTextureCoordinateVs(mi); + const auto vertexLayoutPositionIndices = output->getVertexLayoutPositionIndices(mi); + const auto vertexLayoutTextureCoordinateIndices = output->getVertexLayoutTextureCoordinateIndices(mi); + const auto vs = output->getVertexTextureCoordinateVs(mi); + const auto us = deduplicateTextureCoordinates(output->getVertexTextureCoordinateUs(mi), vs); const std::uint32_t positionCount = output->getVertexPositionCount(mi); RawVector3Vector destVertexPositions {positionCount, {}, getMemoryResource()}; // As there can be multiple VertexLayout per each VertexPosition we will use arithmetic mean value. - Vector vertexLayoutsPerPosition{positionCount, {}, getMemoryResource()}; + Vector vertexLayoutsPerPosition{positionCount, {}, getMemoryResource()}; - for (std::size_t i = 0u; i < vertexLayoutPositionIndices.size(); ++i) { - const std::uint32_t uvIndex = vertexLayoutTextureCoordinateIndices[i]; + for (std::uint32_t vli = 0u; vli < vertexLayoutPositionIndices.size(); ++vli) { + std::uint32_t uvIndex = vertexLayoutTextureCoordinateIndices[vli]; const fvec2 uvs = {us[uvIndex], vs[uvIndex]}; const auto weightsIndicesPair = mapping.getBarycentric(uvs); - const fvec3& barycentric = weightsIndicesPair.first; - auto srcVtxIndices = weightsIndicesPair.second; + fvec3 barycentric = std::get<0>(weightsIndicesPair); + auto srcVtxIndices = std::get<1>(weightsIndicesPair); if (srcVtxIndices.size() == 0) { - // We'll need to handle this case in the future? - assert(false && "Could not map a vertex, did not hit any triangle's bounding box."); - continue; + // We didn't hit any triangle. We aim to identify the nearest face to this UV, ensuring + // that the selected face has an intersection with at least one of the adjacent faces of the vertex we are + // projecting. + float minDistance = std::numeric_limits::max(); + std::uint32_t sourceTriangleIndex = std::numeric_limits::max(); + // First we find all of the faces that are adjacent to this vertex + for (std::uint32_t fi = 0u; fi < output->getFaceCount(mi); fi++) { + const auto face = output->getFaceVertexLayoutIndices(mi, fi); + if (std::find(face.begin(), face.end(), vli) == face.end()) { + continue; + } + + // Gather all vertex UVs from this face and create a bounding box from it + Vector UVs{getMemoryResource()}; + for (const auto vertexLayoutIndex : face) { + uvIndex = vertexLayoutTextureCoordinateIndices[vertexLayoutIndex]; + UVs.emplace_back(us[uvIndex], vs[uvIndex]); + } + const BoundingBox faceBoundingBox{UVs}; + + // Find the closest triangle that has intersection with this face + auto bBoxes = mapping.getBoundingBoxes(); + for (std::uint32_t bi = 0u; bi < bBoxes.size(); bi++) { + const auto& bBox = bBoxes[bi]; + if (bBox.overlaps(faceBoundingBox)) { + const float distance = bBox.distance(uvs); + if (distance < minDistance) { + minDistance = distance; + sourceTriangleIndex = bi; + } + } + } + } + + if (sourceTriangleIndex != std::numeric_limits::max()) { + barycentric = mapping.getTriangle(sourceTriangleIndex).getBarycentricCoords(uvs); + srcVtxIndices = mapping.getTrianglePositionIndices(sourceTriangleIndex); + } else { + assert(false && "Could not map a vertex. It is not within a face of higher lod."); + continue; + } } const fvec3 src = getSrcVertex(srcVtxIndices[0]) * barycentric[0] + getSrcVertex(srcVtxIndices[1]) * barycentric[1] + getSrcVertex(srcVtxIndices[2]) * barycentric[2]; - const uint32_t positionIndex = vertexLayoutPositionIndices[i]; + const uint32_t positionIndex = vertexLayoutPositionIndices[vli]; float& destX = destVertexPositions.xs[positionIndex]; float& destY = destVertexPositions.ys[positionIndex]; float& destZ = destVertexPositions.zs[positionIndex]; const auto vtxLayoutCount = ++vertexLayoutsPerPosition[positionIndex]; + // We require mean average, more than one vertexLayout for this vertex position + const auto lastDenominator = static_cast(vtxLayoutCount - 1u); + const auto newDenominator = static_cast(vtxLayoutCount); + destX = (destX * lastDenominator + src[0]) / newDenominator; + destY = (destY * lastDenominator + src[1]) / newDenominator; + destZ = (destZ * lastDenominator + src[2]) / newDenominator; - if (vtxLayoutCount == 1) { - destX = src[0]; - destY = src[1]; - destZ = src[2]; - } else { - // We require mean average, more than one vertexLayout for this vertex position - const auto lastDenominator = static_cast(vtxLayoutCount - 1u); - const auto newDenominator = static_cast(vtxLayoutCount); - destX = (destX * lastDenominator + src[0]) / newDenominator; - destY = (destY * lastDenominator + src[1]) / newDenominator; - destZ = (destZ * lastDenominator + src[2]) / newDenominator; - } } output->setVertexPositions(mi, std::move(destVertexPositions)); } @@ -113,12 +169,23 @@ class CalculateMeshLowerLODsCommand::Impl : public CommandImplBase { } } } else { - isLowerLOD = std::find(lodMeshIndices.begin(), lodMeshIndices.end(), meshIndex) != lodMeshIndices.end(); + isLowerLOD = + std::find(lodMeshIndices.begin(), lodMeshIndices.end(), meshIndex) != lodMeshIndices.end(); } } return lowerLODIndices; } + Vector deduplicateTextureCoordinates(ConstArrayView us, ConstArrayView vs) { + Vector usCopy{us.begin(), us.end(), getMemoryResource()}; + if (isUVMapOverlapping(us, vs)) { + // The offset function will not modify those given arrays for which the specified offset is 0.0 + // So const_cast-ing here is just to satisfy the compiler, not for modifying the data sneakily. + offsetOverlappingUVMapRegion(usCopy, {const_cast(vs.data()), vs.size()}, 1.0f, 0.0f); + } + return usCopy; + } + private: std::uint16_t meshIndex; }; diff --git a/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.cpp b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.cpp new file mode 100644 index 00000000..8b3c3597 --- /dev/null +++ b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.cpp @@ -0,0 +1,62 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h" + +#include +#include +#include + +namespace dnac { + +inline bool near(float a, float b, float threshold) { + return std::fabs(a - b) < threshold; +} + +bool isUVMapOverlapping(ConstArrayView us, + ConstArrayView vs, + std::size_t overlapCountThreshold, + float uvCompareThreshold) { + // Quick heuristic to check if the UV is really mirrored into the upper half of the array, + // if first N matches, it will be considered a total match and deduplication should proceed + assert(us.size() == vs.size()); + + if ((us.size() % 2ul) != 0ul) { + return false; + } + + const std::size_t half = (us.size() / 2ul); + for (std::size_t i = {}; i < std::min(half, overlapCountThreshold); ++i) { + bool found = false; + for (std::size_t j = half; j < us.size(); ++j) { + if (near(us[i], us[j], uvCompareThreshold) && near(vs[i], vs[j], uvCompareThreshold)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; +} + +void offsetOverlappingUVMapRegion(ArrayView us, ArrayView vs, float uOffset, float vOffset, + float uvCompareThreshold) { + assert(us.size() == vs.size()); + const std::size_t half = (us.size() / 2ul); + for (std::size_t i = {}; i < half; ++i) { + for (std::size_t j = half; j < us.size(); ++j) { + if (near(us[i], us[j], uvCompareThreshold) && near(vs[i], vs[j], uvCompareThreshold)) { + if (uOffset != 0.0f) { + us[i] += uOffset; + } + if (vOffset != 0.0f) { + vs[i] += vOffset; + } + break; + } + } + } +} + +} // namespace dnac diff --git a/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h new file mode 100644 index 00000000..a0ecec0c --- /dev/null +++ b/dnacalib/DNACalib/src/dnacalib/commands/CalculateMeshLowerLODsCommandImpl.h @@ -0,0 +1,19 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "dnacalib/types/Aliases.h" + +namespace dnac { + +bool isUVMapOverlapping(ConstArrayView us, + ConstArrayView vs, + std::size_t overlapCountThreshold = 10ul, + float uvCompareThreshold = 0.0002f); +void offsetOverlappingUVMapRegion(ArrayView us, + ArrayView vs, + float uOffset = 1.0f, + float vOffset = 0.0f, + float uvCompareThreshold = 0.0002f); + +} // namespace dnac diff --git a/dnacalib/DNACalib/src/dnacalib/dna/filters/JointFilter.cpp b/dnacalib/DNACalib/src/dnacalib/dna/filters/JointFilter.cpp index ea34afd6..e9f7cd8a 100644 --- a/dnacalib/DNACalib/src/dnacalib/dna/filters/JointFilter.cpp +++ b/dnacalib/DNACalib/src/dnacalib/dna/filters/JointFilter.cpp @@ -70,7 +70,7 @@ void JointFilter::apply(RawBehavior& dest) { } } // Collect row indices of removed output indices to be used for joint delta removal - Set rowsToDelete{memRes}; + UnorderedSet rowsToDelete{memRes}; // Remove output indices belonging to the deletable joint extd::filter(jointGroup.outputIndices, [this, &rowsToDelete](std::uint16_t outputIndex, std::size_t rowIndex) { const auto jointIndex = static_cast(outputIndex / jointAttributeCount); diff --git a/dnacalib/DNACalib/src/dnacalib/types/BoundingBox.h b/dnacalib/DNACalib/src/dnacalib/types/BoundingBox.h index 166f894c..051524a6 100644 --- a/dnacalib/DNACalib/src/dnacalib/types/BoundingBox.h +++ b/dnacalib/DNACalib/src/dnacalib/types/BoundingBox.h @@ -42,11 +42,22 @@ class BoundingBox { BoundingBox(std::begin(container), std::end(container), alpha) { } - bool contains(const fvec2& point) const { + bool contains(fvec2 point) const { return point[0] >= min[0] && point[0] <= max[0] && point[1] >= min[1] && point[1] <= max[1]; } + float distance(fvec2 point) const { + const float dx = std::max({min[0] - point[0], 0.0f, point[0] - max[0]}); + const float dy = std::max({min[1] - point[1], 0.0f, point[1] - max[1]}); + return std::sqrt(dx * dx + dy * dy); + } + + bool overlaps(const BoundingBox& other) const { + return (max[0] >= other.min[0] && other.max[0] >= min[0]) && + (max[1] >= other.min[1] && other.max[1] >= min[1]); + } + fvec2 getMin() const { return min; } diff --git a/dnacalib/DNACalib/src/dnacalib/types/Triangle.h b/dnacalib/DNACalib/src/dnacalib/types/Triangle.h index b68941ea..4b721164 100644 --- a/dnacalib/DNACalib/src/dnacalib/types/Triangle.h +++ b/dnacalib/DNACalib/src/dnacalib/types/Triangle.h @@ -2,7 +2,6 @@ #pragma once -#include "dnacalib/types/Aliases.h" #include "dnacalib/TypeDefs.h" #include @@ -15,12 +14,6 @@ class Triangle { Triangle(const fvec2& a, const fvec2& b, const fvec2& c); explicit Triangle(const std::array& vertices); - Triangle(const Triangle& triangle) = default; - Triangle& operator=(const Triangle& triangle) = default; - - Triangle(Triangle&&) = default; - Triangle& operator=(Triangle&& triangle) = default; - fvec3 getBarycentricCoords(const fvec2& point) const; fvec2 A() const; diff --git a/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.cpp b/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.cpp index 1902ac35..ceb2518c 100644 --- a/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.cpp +++ b/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.cpp @@ -12,73 +12,74 @@ UVBarycentricMapping::UVBarycentricMapping(const std::function(static_cast(faceCount) * 2.5f); triangles.reserve(estimatedTriangleCount); - bBoxes.reserve(estimatedTriangleCount); - for (std::uint32_t i = 0u; i < faceCount; i++) { - auto face = faceGetter(i); - while (face.size() > 2) { - const auto vertexLayoutIndex0 = face[0]; - const auto vertexLayoutIndex1 = face[1]; - const auto vertexLayoutIndex2 = face[face.size() - 1u]; + boundingBoxes.reserve(estimatedTriangleCount); + trianglePositionIndices.reserve(estimatedTriangleCount); - const std::array positionIndices {vertexPositionIndices[vertexLayoutIndex0], - vertexPositionIndices[vertexLayoutIndex1], - vertexPositionIndices[vertexLayoutIndex2]}; + for (std::uint32_t fi = 0u; fi < faceCount; fi++) { + auto face = faceGetter(fi); + if (face.size() > 2) { + const auto n = face.size(); + for (std::uint32_t i = 0; i < n - 2; ++i) { + for (std::uint32_t j = i + 1; j < n - 1; ++j) { + for (std::uint32_t k = j + 1; k < n; ++k) { + const auto vli0 = face[i]; + const auto vli1 = face[j]; + const auto vli2 = face[k]; + const std::array positionIndices {vertexPositionIndices[vli0], + vertexPositionIndices[vli1], + vertexPositionIndices[vli2]}; + const auto uvIndex0 = textureCoordinateUVIndices[vli0]; + const auto uvIndex1 = textureCoordinateUVIndices[vli1]; + const auto uvIndex2 = textureCoordinateUVIndices[vli2]; - const auto uvIndex0 = textureCoordinateUVIndices[vertexLayoutIndex0]; - const auto uvIndex1 = textureCoordinateUVIndices[vertexLayoutIndex1]; - const auto uvIndex2 = textureCoordinateUVIndices[vertexLayoutIndex2]; - - const std::array UVs = {fvec2{Us[uvIndex0], Vs[uvIndex0]}, - fvec2{Us[uvIndex1], Vs[uvIndex1]}, - fvec2{Us[uvIndex2], Vs[uvIndex2]}}; - - triangles.emplace_back(Triangle{UVs}, positionIndices); - bBoxes.emplace_back(BoundingBox{UVs}); - face = face.last(face.size() - 1u); + const std::array UVs = {fvec2{Us[uvIndex0], Vs[uvIndex0]}, + fvec2{Us[uvIndex1], Vs[uvIndex1]}, + fvec2{Us[uvIndex2], Vs[uvIndex2]}}; + triangles.emplace_back(UVs); + boundingBoxes.emplace_back(UVs); + trianglePositionIndices.emplace_back(positionIndices); + } + } + } } } triangles.shrink_to_fit(); - bBoxes.shrink_to_fit(); + boundingBoxes.shrink_to_fit(); + trianglePositionIndices.shrink_to_fit(); } -UVBarycentricMapping::UVBarycentricMapping(const dna::Reader* reader, std::uint16_t meshIndex, MemoryResource* memRes) : - UVBarycentricMapping(std::bind(&dna::Reader::getFaceVertexLayoutIndices, reader, meshIndex, std::placeholders::_1), - reader->getVertexLayoutPositionIndices(meshIndex), - reader->getVertexLayoutTextureCoordinateIndices(meshIndex), - reader->getVertexTextureCoordinateUs(meshIndex), - reader->getVertexTextureCoordinateVs(meshIndex), - reader->getFaceCount(meshIndex), - memRes) { - +UVBarycentricMapping::BarycentricPositionIndicesPair UVBarycentricMapping::getBarycentric(fvec2 uv) const { + const auto isPointInsideTriangle = [](const fvec3& barycentricPoint) { + return barycentricPoint[0] > 0.0f && barycentricPoint[1] > 0.0f && barycentricPoint[2] > 0.0f; + }; + for (std::uint32_t i = 0; i < triangles.size(); i++) { + const auto& triangle = triangles[i]; + // we check if point is inside triangle (all barycentric coordinates are positive) + if (boundingBoxes[i].contains(uv)) { + const auto barycentricPoint = triangle.getBarycentricCoords(uv); + if (isPointInsideTriangle(barycentricPoint)) { + return BarycentricPositionIndicesPair{barycentricPoint, + ConstArrayView{trianglePositionIndices[i]}}; + } + } + } + return {}; } -ConstArrayView UVBarycentricMapping::getTriangles() const { - return {triangles.data(), triangles.size()}; +const Triangle& UVBarycentricMapping::getTriangle(std::uint32_t index) const { + return triangles[index]; } -ConstArrayView UVBarycentricMapping::getBoundingBoxes() const { - return {bBoxes.data(), bBoxes.size()}; +ConstArrayView UVBarycentricMapping::getTrianglePositionIndices(std::uint32_t index) const { + return trianglePositionIndices[index]; } -UVBarycentricMapping::BarycentricPositionIndicesPair UVBarycentricMapping::getBarycentric(const fvec2& uv) const { - BarycentricPositionIndicesPair barycentricPositionsPair; - for (std::uint32_t i = 0u; i < bBoxes.size(); i++) { - if (bBoxes[i].contains(uv)) { - const auto barycentricWeights = triangles[i].first.getBarycentricCoords(uv); - // If we don't hit any triangle, we will use one whose bounding box we hit - barycentricPositionsPair = {barycentricWeights, ConstArrayView{triangles[i].second}}; - if ((barycentricWeights[0] >= 0.0f) && (barycentricWeights[0] <= 1.0f) && - (barycentricWeights[1] >= 0.0f) && (barycentricWeights[1] <= 1.0f) && - (barycentricWeights[2] >= 0.0f) && (barycentricWeights[2] <= 1.0f)) { - return barycentricPositionsPair; - } - } - } - return barycentricPositionsPair; +ConstArrayView UVBarycentricMapping::getBoundingBoxes() const { + return boundingBoxes; } } // namespace dnac diff --git a/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.h b/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.h index 645ff50a..71b3fdab 100644 --- a/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.h +++ b/dnacalib/DNACalib/src/dnacalib/types/UVBarycentricMapping.h @@ -3,16 +3,15 @@ #pragma once #include "dnacalib/types/Aliases.h" -#include "dnacalib/types/Triangle.h" #include "dnacalib/types/BoundingBox.h" +#include "dnacalib/types/Triangle.h" namespace dnac { - class UVBarycentricMapping { public: - using TrianglePositionIndicesPair = std::pair >; - using BarycentricPositionIndicesPair = std::pair >; + using TrianglePositionIndicesPair = std::tuple >; + using BarycentricPositionIndicesPair = std::tuple >; public: UVBarycentricMapping(const std::function(std::uint32_t)>& faceGetter, @@ -23,16 +22,15 @@ class UVBarycentricMapping { std::uint32_t faceCount, MemoryResource* memRes); - explicit UVBarycentricMapping(const dna::Reader* reader, std::uint16_t meshIndex, MemoryResource* memRes); - - ConstArrayView getTriangles() const; + BarycentricPositionIndicesPair getBarycentric(fvec2 uv) const; + const Triangle& getTriangle(std::uint32_t index) const; + ConstArrayView getTrianglePositionIndices(std::uint32_t index) const; ConstArrayView getBoundingBoxes() const; - BarycentricPositionIndicesPair getBarycentric(const fvec2& uv) const; - private: - Vector triangles; - Vector bBoxes; + Vector triangles; + Vector boundingBoxes; + Vector > trianglePositionIndices; }; } // namespace dnac diff --git a/dnacalib/PyDNA/python3/CMakeLists.txt b/dnacalib/PyDNA/python3/CMakeLists.txt index 589fee44..3736e0f6 100644 --- a/dnacalib/PyDNA/python3/CMakeLists.txt +++ b/dnacalib/PyDNA/python3/CMakeLists.txt @@ -2,13 +2,15 @@ set(PYTHON3_EXACT_VERSION "" CACHE STRING "Specify exact python3 version against if(PYTHON3_EXACT_VERSION) set(find_python3_extra_args ${PYTHON3_EXACT_VERSION} EXACT) endif() -find_package(Python3 ${find_python3_extra_args} COMPONENTS Development) +find_package(Python3 ${find_python3_extra_args} COMPONENTS Development Interpreter) +set(py_version "py${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") +set(output_dir "${py_version}") set_property(SOURCE DNA.i PROPERTY CPLUSPLUS ON) set_property(SOURCE DNA.i PROPERTY SWIG_MODULE_NAME dna) +set_property(SOURCE DNA.i PROPERTY SWIG_FLAGS "-doxygen") option(TYPEMAP_DEBUG "Debug deducing of typemaps" OFF) - if(TYPEMAP_DEBUG) set_property(SOURCE DNA.i PROPERTY SWIG_FLAGS "-debug-tmsearch") endif() @@ -19,12 +21,17 @@ swig_add_library(py3dna LANGUAGE python OUTPUT_DIR - ${CMAKE_BINARY_DIR}/py3bin + ${CMAKE_BINARY_DIR}/${output_dir} + OUTFILE_DIR + ${CMAKE_BINARY_DIR}/python3 SOURCES DNA.i) +add_library(PyDNA::py3dna ALIAS py3dna) -set_property(TARGET py3dna PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) - +set_target_properties(py3dna PROPERTIES + SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON + SWIG_COMPILE_DEFINITIONS DNA_BUILD_WITH_JSON_SUPPORT=ON) +target_compile_definitions(py3dna PRIVATE DNA_BUILD_WITH_JSON_SUPPORT=ON) target_include_directories(py3dna PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries(py3dna PUBLIC @@ -33,14 +40,31 @@ target_link_libraries(py3dna PRIVATE Python3::Python) -add_custom_target(py3dna-distribution ALL - DEPENDS - py3dna - COMMAND - ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy $ ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy $ ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/examples/demo.py ${CMAKE_BINARY_DIR}/py3bin/dna_demo.py) +set(component_name "${PROJECT_NAME}-${py_version}") +get_property(wrapper_files TARGET py3dna PROPERTY SWIG_SUPPORT_FILES) +install(FILES ${wrapper_files} DESTINATION ${output_dir} COMPONENT ${component_name}) +install(TARGETS py3dna + RUNTIME + DESTINATION ${output_dir} + COMPONENT ${component_name} + LIBRARY + DESTINATION ${output_dir} + COMPONENT ${component_name} + NAMELINK_COMPONENT ${component_name} + ARCHIVE + DESTINATION ${output_dir} + COMPONENT ${component_name}) +install(FILES ${CMAKE_CURRENT_LIST_DIR}/examples/demo.py DESTINATION ${output_dir} RENAME dna_demo.py COMPONENT ${component_name}) + +set(CPACK_COMPONENTS_ALL "${CPACK_COMPONENTS_ALL};${component_name}" PARENT_SCOPE) + +if(WIN32) + set(extra_env "PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") +endif() +set(DNA_TEST_NAMES dna_binary_to_json_demo dna_demo) +foreach(test_name ${DNA_TEST_NAMES}) + add_test(NAME ${test_name} + COMMAND ${CMAKE_COMMAND} -E env ${extra_env} LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} PYTHONPATH=. ${Python3_EXECUTABLE} "${CMAKE_CURRENT_LIST_DIR}/../../../examples/${test_name}.py" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${output_dir}) + set_property(TEST ${test_name} PROPERTY PASS_REGULAR_EXPRESSION "Done\.") +endforeach() diff --git a/dnacalib/PyDNA/python3/DNA.i b/dnacalib/PyDNA/python3/DNA.i index 633d9495..8842ae1f 100644 --- a/dnacalib/PyDNA/python3/DNA.i +++ b/dnacalib/PyDNA/python3/DNA.i @@ -1,5 +1,17 @@ %module dna +%pythonbegin +%{ +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass +%} + %{ #include #include diff --git a/dnacalib/PyDNACalib/python3/CMakeLists.txt b/dnacalib/PyDNACalib/python3/CMakeLists.txt index f68618a0..da41b3b8 100644 --- a/dnacalib/PyDNACalib/python3/CMakeLists.txt +++ b/dnacalib/PyDNACalib/python3/CMakeLists.txt @@ -2,13 +2,15 @@ set(PYTHON3_EXACT_VERSION "" CACHE STRING "Specify exact python3 version against if(PYTHON3_EXACT_VERSION) set(find_python3_extra_args ${PYTHON3_EXACT_VERSION} EXACT) endif() -find_package(Python3 ${find_python3_extra_args} COMPONENTS Development) +find_package(Python3 ${find_python3_extra_args} COMPONENTS Development Interpreter) +set(py_version "py${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") +set(output_dir "${py_version}") set_property(SOURCE DNACalib.i PROPERTY CPLUSPLUS ON) set_property(SOURCE DNACalib.i PROPERTY SWIG_MODULE_NAME dnacalib) +set_property(SOURCE DNACalib.i PROPERTY SWIG_FLAGS "-doxygen") option(TYPEMAP_DEBUG "Debug deducing of typemaps" OFF) - if(TYPEMAP_DEBUG) set_property(SOURCE DNACalib.i PROPERTY SWIG_FLAGS "-debug-tmsearch") endif() @@ -19,32 +21,53 @@ swig_add_library(py3dnacalib LANGUAGE python OUTPUT_DIR - ${CMAKE_BINARY_DIR}/py3bin + ${CMAKE_BINARY_DIR}/${output_dir} + OUTFILE_DIR + ${CMAKE_BINARY_DIR}/python3 SOURCES DNACalib.i) +add_library(PyDNACalib::py3dnacalib ALIAS py3dnacalib) -set_property(TARGET py3dnacalib PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) - +set_target_properties(py3dnacalib PROPERTIES SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON) target_link_libraries(py3dnacalib PUBLIC - py3dna + PyDNA::py3dna PRIVATE Spyus::spyus DNACalib::dnacalib Python3::Python) -add_custom_target(py3dnacalib-distribution ALL - DEPENDS - py3dnacalib - COMMAND - ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy $ ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy $ ${CMAKE_BINARY_DIR}/py3bin - COMMAND - ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/examples/demo.py ${CMAKE_BINARY_DIR}/py3bin/dnacalib_demo.py - COMMAND - ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/examples/remove_joint.py ${CMAKE_BINARY_DIR}/py3bin/dnacalib_remove_joint.py - COMMAND - ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/examples/clear_blend_shapes.py ${CMAKE_BINARY_DIR}/py3bin/dnacalib_clear_blend_shapes.py) +set(component_name "${PROJECT_NAME}-${py_version}") +get_property(wrapper_files TARGET py3dnacalib PROPERTY SWIG_SUPPORT_FILES) +install(FILES ${wrapper_files} DESTINATION ${output_dir} COMPONENT ${component_name}) +install(TARGETS py3dnacalib + RUNTIME + DESTINATION ${output_dir} + COMPONENT ${component_name} + LIBRARY + DESTINATION ${output_dir} + COMPONENT ${component_name} + NAMELINK_COMPONENT ${component_name} + ARCHIVE + DESTINATION ${output_dir} + COMPONENT ${component_name}) +install(FILES ${CMAKE_CURRENT_LIST_DIR}/examples/clear_blend_shapes.py DESTINATION ${output_dir}/examples RENAME dnacalib_clear_blend_shapes.py COMPONENT ${component_name}) +install(FILES ${CMAKE_CURRENT_LIST_DIR}/examples/demo.py DESTINATION ${output_dir}/examples RENAME dnacalib_demo.py COMPONENT ${component_name}) +install(FILES ${CMAKE_CURRENT_LIST_DIR}/examples/remove_joint.py DESTINATION ${output_dir}/examples RENAME dnacalib_remove_joint.py COMPONENT ${component_name}) +set(CPACK_COMPONENTS_ALL "${CPACK_COMPONENTS_ALL};${component_name}" PARENT_SCOPE) + +if(WIN32) + set(extra_env "PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") +endif() +set(DNACALIB_TEST_NAMES dnacalib_clear_blend_shapes + dnacalib_demo + dnacalib_lod_demo + dnacalib_neutral_mesh_subtract + dnacalib_remove_joint + dnacalib_rename_joint_demo) +foreach(test_name ${DNACALIB_TEST_NAMES}) + add_test(NAME ${test_name} + COMMAND ${CMAKE_COMMAND} -E env ${extra_env} LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} PYTHONPATH=. ${Python3_EXECUTABLE} "${CMAKE_CURRENT_LIST_DIR}/../../../examples/${test_name}.py" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/${output_dir}) + set_property(TEST ${test_name} PROPERTY PASS_REGULAR_EXPRESSION "Done\.") +endforeach() diff --git a/dnacalib/PyDNACalib/python3/DNACalib.i b/dnacalib/PyDNACalib/python3/DNACalib.i index 705f404b..91519894 100644 --- a/dnacalib/PyDNACalib/python3/DNACalib.i +++ b/dnacalib/PyDNACalib/python3/DNACalib.i @@ -1,5 +1,17 @@ %module dnacalib +%pythonbegin +%{ +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass +%} + %include %include diff --git a/dnacalib/SPyUS/include/spyus/Caster.i b/dnacalib/SPyUS/include/spyus/Caster.i index adc3cbe2..6c80ad27 100644 --- a/dnacalib/SPyUS/include/spyus/Caster.i +++ b/dnacalib/SPyUS/include/spyus/Caster.i @@ -171,28 +171,59 @@ class name(object): %enddef %pythoncode %{ -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): - # FIXME: while this workaround solves the immediate issue with the set of classes we currently have, - # it will fail for classes that use a factory function but need no parameters at all, in which case - # the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) %} -%define pythonize_unmanaged_type(type, creator, destroyer) +%define pythonize_unmanaged_type(typename, creator, destroyer) %pythoncode %{ -type ## .__new__ = __new_decorator(type ## _ ## creator, type ## .__new__) -type ## .__del__ = lambda instance: type ## _ ## destroyer ## (instance) -type ## .__init__ = __managed_init -del type ## .creator -del type ## .destroyer +typename ## Impl = typename + +class typename ## ImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(typename ## Impl, name) + + def __dir__(cls): + return [name for name in dir(typename ## Impl) if name not in (#creator, #destroyer)] + +class typename(with_metaclass(typename ## ImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = typename ## Impl. ## creator(*args, **kwargs) + + def __del__(self): + typename ## Impl. ## destroyer(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in (#creator, #destroyer)] %} %enddef diff --git a/examples/dna_binary_to_json_demo.py b/examples/dna_binary_to_json_demo.py index f8652ca4..d8433643 100644 --- a/examples/dna_binary_to_json_demo.py +++ b/examples/dna_binary_to_json_demo.py @@ -75,6 +75,7 @@ def save_dna(reader, path): def create_json_dna(input_path, output_path): dna_reader = load_dna(input_path) save_dna(dna_reader, output_path) + print('Done.') if __name__ == "__main__": diff --git a/examples/dna_demo.py b/examples/dna_demo.py index 3aee21ea..3ad4b5f6 100644 --- a/examples/dna_demo.py +++ b/examples/dna_demo.py @@ -93,6 +93,7 @@ def create_new_dna(dna_path): create_dna(dna_path) dna_reader = load_dna(dna_path) print_dna_summary(dna_reader) + print('Done.') if __name__ == "__main__": diff --git a/examples/dna_viewer_build_rig_with_textures.py b/examples/dna_viewer_build_rig_with_textures.py new file mode 100644 index 00000000..81a72005 --- /dev/null +++ b/examples/dna_viewer_build_rig_with_textures.py @@ -0,0 +1,355 @@ +""" +This example demonstrates generating functional rig based on DNA file in Maya scene with applied textures. +Maps added in data folder belong to Ada preset character. User should use source data downloaded from Quixel Bridge. +IMPORTANT: You have to setup the environment before running this example. Please refer to the 'Environment setup' section in README.md. + +- usage in command line: + mayapy dna_viewer_build_rig_with_textures.py + NOTE: Script cannot be called with Python, it must be called with mayapy. + +- usage in Maya: + 1. copy whole content of this file to Maya Script Editor + 2. change value of ROOT_DIR to absolute path of dna_calibration, e.g. `c:/dna_calibration` in Windows or `/home/user/dna_calibration`. Important: + Use `/` (forward slash), because Maya uses forward slashes in path. +""" +import time +import os + +# if you use Maya, use absolute path +ROOT_DIR = f"{os.path.dirname(os.path.abspath(__file__))}/..".replace("\\", "/") +DATA_DIR = f"{ROOT_DIR}/data" + +from maya import cmds, mel +from dna_viewer import ( + DNA, + RigConfig, + build_rig +) + +ORIENT_Y = [0.0, 0.0, 0.0] +COMMON_MAP_INFOS = [ + ("dx11_diffuseIrradiance", 1), + ("dx11_jitter", 1), + ("dx11_skinLUT", 1), + ("dx11_specularIrradiance", 1), +] + +MAP_INFOS = [ + ("head_color", 1), + ("head_cm1_color", 0), + ("head_cm2_color", 0), + ("head_cm3_color", 0), + ("head_normal", 1), + ("head_wm1_normal", 0), + ("head_wm2_normal", 0), + ("head_wm3_normal", 0), + ("head_specular", 1), + ("head_specular_16Bits", 1), + ("head_occlusion", 1), + ("head_occlusion_16Bits", 1), + ("head_cavity", 1), + ("head_cavity_16Bits", 1), + ("head_transmission", 1), + ("head_transmission_16Bits", 1), + ("head_curvature", 1), + ("head_curvature_16Bits", 1), + ("head_position", 1), + ("head_position_16Bits", 1), + ("head_worldspace", 1), + ("head_worldspace_16Bits", 1), + ("head_bentNormal", 1), + ("head_bentNormal_16Bits", 1), + ("teeth_color", 1), + ("teeth_normal", 1), + ("eyes_color", 1), + ("eyeLeft_color", 1), + ("eyeRight_color", 1), + ("eyeLeft_normal", 1), + ("eyeRight_normal", 1), + ("eyes_color_16Bits", 1), + ("eyes_normal", 1), + ("eyes_normal_16Bits", 1), + ("eyelashes_color", 1), +] + +MASKS = [ + "head_wm1_blink_L", + "head_wm1_blink_R", + "head_wm1_browsRaiseInner_L", + "head_wm1_browsRaiseInner_R", + "head_wm1_browsRaiseOuter_L", + "head_wm1_browsRaiseOuter_R", + "head_wm1_chinRaise_L", + "head_wm1_chinRaise_R", + "head_wm1_jawOpen", + "head_wm1_purse_DL", + "head_wm1_purse_DR", + "head_wm1_purse_UL", + "head_wm1_purse_UR", + "head_wm1_squintInner_L", + "head_wm1_squintInner_R", + "head_wm2_browsDown_L", + "head_wm2_browsDown_R", + "head_wm2_browsLateral_L", + "head_wm2_browsLateral_R", + "head_wm2_mouthStretch_L", + "head_wm2_mouthStretch_R", + "head_wm2_neckStretch_L", + "head_wm2_neckStretch_R", + "head_wm2_noseWrinkler_L", + "head_wm2_noseWrinkler_R", + "head_wm3_cheekRaiseInner_L", + "head_wm3_cheekRaiseInner_R", + "head_wm3_cheekRaiseOuter_L", + "head_wm3_cheekRaiseOuter_R", + "head_wm3_cheekRaiseUpper_L", + "head_wm3_cheekRaiseUpper_R", + "head_wm3_smile_L", + "head_wm3_smile_R", + "head_wm13_lips_DL", + "head_wm13_lips_DR", + "head_wm13_lips_UL", + "head_wm13_lips_UR", +] + +MESH_SHADER_MAPPING = { + "head_lod": "head_shader", + "teeth_lod": "teeth_shader", + "saliva_lod": "saliva_shader", + "eyeLeft_lod": "eyeLeft_shader", + "eyeRight_lod": "eyeRight_shader", + "eyeshell_lod": "eyeshell_shader", + "eyelashes_lod": "eyelashes_shader", + "eyelashesShadow_lod": "eyelashesShadow_shader", + "eyeEdge_lod": "eyeEdge_shader", + "cartilage_lod": "eyeEdge_shader", +} + +SHADERS = ["head_shader", "teeth_shader", "eyeLeft_shader", "eyeRight_shader"] + +SHADER_ATTRIBUTES_MAPPING = { + "FRM_WMmultipliers.head_cm2_color_head_wm2_browsDown_L": "shader_head_shader.maskWeight_00", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_browsDown_L": "shader_head_shader.maskWeight_01", + "FRM_WMmultipliers.head_cm2_color_head_wm2_browsDown_R": "shader_head_shader.maskWeight_02", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_browsDown_R": "shader_head_shader.maskWeight_03", + "FRM_WMmultipliers.head_cm2_color_head_wm2_browsLateral_L": "shader_head_shader.maskWeight_04", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_browsLateral_L": "shader_head_shader.maskWeight_05", + "FRM_WMmultipliers.head_cm2_color_head_wm2_browsLateral_R": "shader_head_shader.maskWeight_06", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_browsLateral_R": "shader_head_shader.maskWeight_07", + "FRM_WMmultipliers.head_cm1_color_head_wm1_browsRaiseInner_L": "shader_head_shader.maskWeight_08", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_browsRaiseInner_L": "shader_head_shader.maskWeight_09", + "FRM_WMmultipliers.head_cm1_color_head_wm1_browsRaiseInner_R": "shader_head_shader.maskWeight_10", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_browsRaiseInner_R": "shader_head_shader.maskWeight_11", + "FRM_WMmultipliers.head_cm1_color_head_wm1_browsRaiseOuter_L": "shader_head_shader.maskWeight_12", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_browsRaiseOuter_L": "shader_head_shader.maskWeight_13", + "FRM_WMmultipliers.head_cm1_color_head_wm1_browsRaiseOuter_R": "shader_head_shader.maskWeight_14", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_browsRaiseOuter_R": "shader_head_shader.maskWeight_15", + "FRM_WMmultipliers.head_cm1_color_head_wm1_blink_L": "shader_head_shader.maskWeight_16", + "FRM_WMmultipliers.head_cm1_color_head_wm1_squintInner_L": "shader_head_shader.maskWeight_17", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_blink_L": "shader_head_shader.maskWeight_18", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_squintInner_L": "shader_head_shader.maskWeight_19", + "FRM_WMmultipliers.head_cm1_color_head_wm1_blink_R": "shader_head_shader.maskWeight_20", + "FRM_WMmultipliers.head_cm1_color_head_wm1_squintInner_R": "shader_head_shader.maskWeight_21", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_blink_R": "shader_head_shader.maskWeight_22", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_squintInner_R": "shader_head_shader.maskWeight_23", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseInner_L": "shader_head_shader.maskWeight_24", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseOuter_L": "shader_head_shader.maskWeight_25", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseUpper_L": "shader_head_shader.maskWeight_26", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseInner_L": "shader_head_shader.maskWeight_27", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseOuter_L": "shader_head_shader.maskWeight_28", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseUpper_L": "shader_head_shader.maskWeight_29", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseInner_R": "shader_head_shader.maskWeight_30", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseOuter_R": "shader_head_shader.maskWeight_31", + "FRM_WMmultipliers.head_cm3_color_head_wm3_cheekRaiseUpper_R": "shader_head_shader.maskWeight_32", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseInner_R": "shader_head_shader.maskWeight_33", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseOuter_R": "shader_head_shader.maskWeight_34", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_cheekRaiseUpper_R": "shader_head_shader.maskWeight_35", + "FRM_WMmultipliers.head_cm2_color_head_wm2_noseWrinkler_L": "shader_head_shader.maskWeight_36", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_noseWrinkler_L": "shader_head_shader.maskWeight_37", + "FRM_WMmultipliers.head_cm2_color_head_wm2_noseWrinkler_R": "shader_head_shader.maskWeight_38", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_noseWrinkler_R": "shader_head_shader.maskWeight_39", + "FRM_WMmultipliers.head_cm3_color_head_wm3_smile_L": "shader_head_shader.maskWeight_40", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_smile_L": "shader_head_shader.maskWeight_41", + "FRM_WMmultipliers.head_cm1_color_head_wm13_lips_UL": "shader_head_shader.maskWeight_42", + "FRM_WMmultipliers.head_cm1_color_head_wm13_lips_UR": "shader_head_shader.maskWeight_43", + "FRM_WMmultipliers.head_cm1_color_head_wm13_lips_DL": "shader_head_shader.maskWeight_44", + "FRM_WMmultipliers.head_cm1_color_head_wm13_lips_DR": "shader_head_shader.maskWeight_45", + "FRM_WMmultipliers.head_wm1_normal_head_wm13_lips_UL": "shader_head_shader.maskWeight_46", + "FRM_WMmultipliers.head_wm1_normal_head_wm13_lips_UR": "shader_head_shader.maskWeight_47", + "FRM_WMmultipliers.head_wm1_normal_head_wm13_lips_DL": "shader_head_shader.maskWeight_48", + "FRM_WMmultipliers.head_wm1_normal_head_wm13_lips_DR": "shader_head_shader.maskWeight_49", + "FRM_WMmultipliers.head_cm3_color_head_wm3_smile_R": "shader_head_shader.maskWeight_50", + "FRM_WMmultipliers.head_wm3_normal_head_wm3_smile_R": "shader_head_shader.maskWeight_51", + "FRM_WMmultipliers.head_cm3_color_head_wm13_lips_UL": "shader_head_shader.maskWeight_52", + "FRM_WMmultipliers.head_cm3_color_head_wm13_lips_DL": "shader_head_shader.maskWeight_53", + "FRM_WMmultipliers.head_wm3_normal_head_wm13_lips_UL": "shader_head_shader.maskWeight_54", + "FRM_WMmultipliers.head_wm3_normal_head_wm13_lips_DL": "shader_head_shader.maskWeight_55", + "FRM_WMmultipliers.head_cm3_color_head_wm13_lips_UR": "shader_head_shader.maskWeight_56", + "FRM_WMmultipliers.head_cm3_color_head_wm13_lips_DR": "shader_head_shader.maskWeight_57", + "FRM_WMmultipliers.head_wm3_normal_head_wm13_lips_UR": "shader_head_shader.maskWeight_58", + "FRM_WMmultipliers.head_wm3_normal_head_wm13_lips_DR": "shader_head_shader.maskWeight_59", + "FRM_WMmultipliers.head_cm2_color_head_wm2_mouthStretch_L": "shader_head_shader.maskWeight_60", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_mouthStretch_L": "shader_head_shader.maskWeight_61", + "FRM_WMmultipliers.head_cm2_color_head_wm2_mouthStretch_R": "shader_head_shader.maskWeight_62", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_mouthStretch_R": "shader_head_shader.maskWeight_63", + "FRM_WMmultipliers.head_cm1_color_head_wm1_purse_UL": "shader_head_shader.maskWeight_64", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_purse_UL": "shader_head_shader.maskWeight_65", + "FRM_WMmultipliers.head_cm1_color_head_wm1_purse_UR": "shader_head_shader.maskWeight_66", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_purse_UR": "shader_head_shader.maskWeight_67", + "FRM_WMmultipliers.head_cm1_color_head_wm1_purse_DL": "shader_head_shader.maskWeight_68", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_purse_DL": "shader_head_shader.maskWeight_69", + "FRM_WMmultipliers.head_cm1_color_head_wm1_purse_DR": "shader_head_shader.maskWeight_70", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_purse_DR": "shader_head_shader.maskWeight_71", + "FRM_WMmultipliers.head_cm1_color_head_wm1_chinRaise_L": "shader_head_shader.maskWeight_72", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_chinRaise_L": "shader_head_shader.maskWeight_73", + "FRM_WMmultipliers.head_cm1_color_head_wm1_chinRaise_R": "shader_head_shader.maskWeight_74", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_chinRaise_R": "shader_head_shader.maskWeight_75", + "FRM_WMmultipliers.head_cm1_color_head_wm1_jawOpen": "shader_head_shader.maskWeight_76", + "FRM_WMmultipliers.head_wm1_normal_head_wm1_jawOpen": "shader_head_shader.maskWeight_77", + "FRM_WMmultipliers.head_cm2_color_head_wm2_neckStretch_L": "shader_head_shader.maskWeight_78", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_neckStretch_L": "shader_head_shader.maskWeight_79", + "FRM_WMmultipliers.head_cm2_color_head_wm2_neckStretch_R": "shader_head_shader.maskWeight_80", + "FRM_WMmultipliers.head_wm2_normal_head_wm2_neckStretch_R": "shader_head_shader.maskWeight_81", +} + + +# Methods +def import_head_shaders(shader_scene_path, shaders_dir_path, masks_dir_path, maps_dir_path): + import_shader(shader_scene_path, MESH_SHADER_MAPPING) + + resolve_scene_shader_paths(SHADERS, shaders_dir_path) + + set_mask_textures(MASKS, masks_dir_path) + set_map_textures(COMMON_MAP_INFOS, maps_dir_path) + set_map_textures(MAP_INFOS, maps_dir_path) + + connect_attributes_to_shader(SHADER_ATTRIBUTES_MAPPING) + + +def import_shader(shader_scene_path, mesh_shader_mapping): + print("Shader scene imported") + cmds.file(shader_scene_path, options="v=0", type="mayaAscii", i=True) + try: + items = mesh_shader_mapping.iteritems() + except: + items = mesh_shader_mapping.items() + for meshName, shaderName in items: + for lodLvl in range(0, 8): + try: + # Apply shader to all meshes based on LOD level + resolved_mesh_name = meshName + str(lodLvl) + "_mesh" + shader = "shader_" + shaderName + cmds.select(resolved_mesh_name, replace=True) + mel.eval("sets -e -forceElement " + shader + "SG") + except: + print("Skipped adding shader for mesh %s." % meshName) + + +def resolve_scene_shader_paths(shaders, folder_name): + for shader in shaders: + node_name = "shader_" + shader + if not cmds.objExists(node_name): + continue + file_shader_name = cmds.getAttr(node_name + ".shader") + shader_folder_name, shader_file_name = os.path.split(file_shader_name) + shader_folder_name = folder_name + cmds.setAttr( + node_name + ".shader", + shader_folder_name + "/" + shader_file_name, + type="string", + ) + + +def set_mask_textures(masks, folder_name): + for mask in masks: + node_name = "maskFile_" + mask + + if not cmds.objExists(node_name): + continue + + file_texture_name = cmds.getAttr(node_name + ".fileTextureName") + texture_folder_name, texture_file_name = os.path.split(file_texture_name) + texture_folder_name = folder_name + cmds.setAttr( + node_name + ".fileTextureName", + texture_folder_name + "/" + texture_file_name, + type="string", + ) + + +def set_map_textures(map_infos, folder_name): + for mapInfo in map_infos: + node_name = "mapFile_" + mapInfo[0] + if mapInfo[1]: + node_name = "baseMapFile_" + mapInfo[0] + + if not cmds.objExists(node_name): + continue + + file_texture_name = cmds.getAttr(node_name + ".fileTextureName") + texture_folder_name, texture_file_name = os.path.split(file_texture_name) + texture_folder_name = folder_name + cmds.setAttr( + node_name + ".fileTextureName", + texture_folder_name + "/" + texture_file_name, + type="string", + ) + + +def connect_attributes_to_shader(shader_attributes_mapping): + print("Connecting attributes to shader...") + try: + items = shader_attributes_mapping.iteritems() + except Exception as ex: + print(f"Error: {ex}") + items = shader_attributes_mapping.items() + + for frm_attribute, shaderAttribute in items: + if cmds.objExists(frm_attribute) and cmds.objExists(shaderAttribute): + cmds.connectAttr(frm_attribute, shaderAttribute, force=True) + + +def create_lights(lights_file_path, orient): + print("Creating lights...") + cmds.file(lights_file_path, defaultNamespace=True, i=True) + cmds.xform("Lights", ro=orient) + cmds.makeIdentity("Lights", apply=True) + + +# Define all paths +dna_path = f"{DATA_DIR}/mh4/dna_files/Ada.dna" +gui_path = f"{DATA_DIR}/mh4/gui.ma" +aas_path = f"{DATA_DIR}/mh4/additional_assemble_script.py" +ac_path = f"{DATA_DIR}/analog_gui.ma" +light_scene = f"{DATA_DIR}/lights.ma" +shader_scene = f"{DATA_DIR}/shader.ma" +shaders_dir = f"{DATA_DIR}/shaders" +masks_dir = f"{DATA_DIR}/masks" +maps_dir = f"{DATA_DIR}/maps" +output_scene = f"{ROOT_DIR}/output/Ada_rig.mb" + +try: + start_time = time.time() + + # open new scene + cmds.file(new=True, force=True) + + # import DNA data + dna = DNA(dna_path) + + config = RigConfig( + gui_path=gui_path, + analog_gui_path=ac_path, + aas_path=aas_path, + ) + build_rig(dna=dna, config=config) + import_head_shaders(shader_scene, shaders_dir, masks_dir, maps_dir) + create_lights(light_scene, ORIENT_Y) + + # save scene + cmds.file(rename=output_scene) + cmds.file(save=True, type="mayaBinary") + + print("--- Import finished in %s seconds ---" % (time.time() - start_time)) +except Exception as ex: + print("Error building scene", ex) diff --git a/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py b/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py index 618b9e86..b226f9aa 100644 --- a/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py +++ b/examples/dna_viewer_grab_changes_from_scene_and_propagate_to_dna.py @@ -6,7 +6,7 @@ 1. Start Maya 2. open maya scene (do 2.1 or 2.2) -2.1. Open existing maya scene generated from dna or +2.1. Generate new scene using build_meshes or 2.2. start DNA Viewer GUI (dna_viewer_run_in_maya.py) - Select DNA file that you want to load and generate scene for - Select meshes that you want to change @@ -79,7 +79,7 @@ VectorOperation_Add, ) -from dna_viewer import DNA, RigConfig, build_rig +from dna_viewer import DNA, RigConfig, build_rig, build_meshes def load_dna_reader(path): @@ -202,12 +202,18 @@ def assemble_maya_scene(): makedirs(OUTPUT_DIR, exist_ok=True) dna = DNA(CHARACTER_DNA) -config = RigConfig( - gui_path=f"{DATA_DIR}/gui.ma", - analog_gui_path=f"{DATA_DIR}/analog_gui.ma", - aas_path=ADDITIONAL_ASSEMBLE_SCRIPT, -) -build_rig(dna=dna, config=config) +################################## +# This is step 2 sub-step 1 +# use this block only if you need to assemble of scene from step 2.1 +# config = RigConfig( +# gui_path=f"{DATA_DIR}/gui.ma", +# analog_gui_path=f"{DATA_DIR}/analog_gui.ma", +# aas_path=ADDITIONAL_ASSEMBLE_SCRIPT, +# ) +# build_meshes(dna=dna, config=config) +# This is end of step 2 sub-step 1 +################################## + # This is step 3 sub-step a current_vertices_positions = {} diff --git a/examples/dnacalib_lod_demo.py b/examples/dnacalib_lod_demo.py index 74d4cdcd..9001ecca 100644 --- a/examples/dnacalib_lod_demo.py +++ b/examples/dnacalib_lod_demo.py @@ -15,7 +15,7 @@ - change CHARACTER_NAME to Taro, or the name of a custom DNA file placed in /data/dna_files - change value of LODS to list of lods needed to be extracted -Expected: Script will generate Ada_with_lods_1_and_3.dna in OUTPUT_DIR, from original Ada.dna. +Expected: Script will generate Ada_with_lods_1_and_3.dna in OUTPUT_DIR, from original Ada. NOTE: If OUTPUT_DIR does not exist, it will be created. """ @@ -27,8 +27,11 @@ ROOT_DIR = f"{ospath.dirname(ospath.abspath(__file__))}/..".replace("\\", "/") OUTPUT_DIR = f"{ROOT_DIR}/output" -import dnacalib as dnacalib -import dna +from dna import DataLayer_All, FileStream, Status, BinaryStreamReader, BinaryStreamWriter +from dnacalib import ( + DNACalibDNAReader, + SetLODsCommand, +) # Sets DNA file path DNA = f"{ROOT_DIR}/data/dna_files/Ada.dna" @@ -38,17 +41,21 @@ LODS = [1, 3] -def save_dna(reader: dnacalib.DNACalibDNAReader, created_dna_path: str): +def save_dna(reader: DNACalibDNAReader, created_dna_path: str): # Saves the dna - stream = dna.FileStream(created_dna_path, dna.FileStream.AccessMode_Write, dna.FileStream.OpenMode_Binary) - writer = dna.BinaryStreamWriter(stream) + stream = FileStream(created_dna_path, FileStream.AccessMode_Write, FileStream.OpenMode_Binary) + writer = BinaryStreamWriter(stream) writer.setFrom(reader) writer.write() + if not Status.isOk(): + status = Status.get() + raise RuntimeError(f"Error saving DNA: {status.message}") + def run_SetLODsCommand(reader): - calibrated = dnacalib.DNACalibDNAReader(reader) - command = dnacalib.SetLODsCommand() + calibrated = DNACalibDNAReader(reader) + command = SetLODsCommand() # Set a list of LODs that will be exported to the new file command.setLODs(LODS) # Runs the command that reduces LODs of the DNA @@ -58,8 +65,8 @@ def run_SetLODsCommand(reader): if calibrated.getLODCount() != 2: raise RuntimeError("Setting new number of LODs in DNA was unsuccessful!") - print("\nSuccessfully changed number of LODs in DNA.") - print("Saving DNA...") + print("\nSuccessfully changed number of LODs in ") + print("Saving ..") # Save the newly created DNA save_dna(calibrated, DNA_NEW) print("Done.") @@ -67,8 +74,8 @@ def run_SetLODsCommand(reader): def load_dna_calib(dna_path: str): # Load the DNA - stream = dna.FileStream(dna_path, dna.FileStream.AccessMode_Read, dna.FileStream.OpenMode_Binary) - reader = dna.BinaryStreamReader(stream, dna.DataLayer_All) + stream = FileStream(dna_path, FileStream.AccessMode_Read, FileStream.OpenMode_Binary) + reader = BinaryStreamReader(stream, DataLayer_All) reader.read() return reader diff --git a/examples/dnacalib_rename_joint_demo.py b/examples/dnacalib_rename_joint_demo.py index 2469437a..6fd6d3c7 100644 --- a/examples/dnacalib_rename_joint_demo.py +++ b/examples/dnacalib_rename_joint_demo.py @@ -71,3 +71,4 @@ def save_dna(reader, path): # Prints the new joint name print(calibrated.getJointName(10)) save_dna(calibrated, OUTPUT_DNA) + print('Done.') diff --git a/lib/Maya2022/linux/_py3dna.so b/lib/Maya2022/linux/_py3dna.so index 4ac114a5..f259f85e 100644 Binary files a/lib/Maya2022/linux/_py3dna.so and b/lib/Maya2022/linux/_py3dna.so differ diff --git a/lib/Maya2022/linux/_py3dnacalib.so b/lib/Maya2022/linux/_py3dnacalib.so index e322e7b2..f86b04be 100644 Binary files a/lib/Maya2022/linux/_py3dnacalib.so and b/lib/Maya2022/linux/_py3dnacalib.so differ diff --git a/lib/Maya2022/linux/dna.py b/lib/Maya2022/linux/dna.py index 10915cd2..ed8fbaa0 100644 --- a/lib/Maya2022/linux/dna.py +++ b/lib/Maya2022/linux/dna.py @@ -4,6 +4,18 @@ # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + from sys import version_info as _swig_python_version_info if _swig_python_version_info < (2, 7, 0): raise RuntimeError("Python 2.7 or later required") @@ -62,22 +74,25 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -95,6 +110,11 @@ def deallocate(self, ptr, size, alignment): _py3dna.MemoryResource_swigregister(MemoryResource) class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -112,6 +132,11 @@ def __init__(self): _py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dna.delete_ArenaMemoryResource @@ -120,18 +145,26 @@ def __init__(self, *args): _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) # Register ArenaMemoryResource in _py3dna: _py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -194,6 +227,35 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ return _py3dna.Readable_read(self, *args) # Register Readable in _py3dna: @@ -207,6 +269,35 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ return _py3dna.Writable_write(self, *args) # Register Writable in _py3dna: @@ -220,9 +311,21 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_tell(self) def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_seek(self, position) # Register Seekable in _py3dna: @@ -236,6 +339,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def open(self): + r""" Open access to the stream.""" return _py3dna.Openable_open(self) # Register Openable in _py3dna: @@ -249,6 +353,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def close(self): + r""" Close access to the stream.""" return _py3dna.Closeable_close(self) # Register Closeable in _py3dna: @@ -272,6 +377,12 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ return _py3dna.Bounded_size(self) # Register Bounded in _py3dna: @@ -285,6 +396,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def flush(self): + r""" Flush the changes to filesystem.""" return _py3dna.Buffered_flush(self) # Register Buffered in _py3dna: @@ -298,6 +410,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def resize(self, size): + r""" Resize file to the requested size.""" return _py3dna.Resizable_resize(self, size) # Register Resizable in _py3dna: @@ -326,6 +439,8 @@ def __init__(self, *args, **kwargs): OpenMode_Binary = _py3dna.OpenMode_Binary OpenMode_Text = _py3dna.OpenMode_Text class FileStream(BoundedIOStream): + r""" Standard file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -334,10 +449,37 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_FileStream @@ -345,12 +487,41 @@ def destroy(instance): _py3dna.FileStream_swigregister(FileStream) def FileStream_create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) def FileStream_destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -359,10 +530,34 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream @@ -370,12 +565,38 @@ def destroy(instance): _py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) def MemoryMappedFileStream_create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) def MemoryMappedFileStream_destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -384,10 +605,63 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryStream @@ -395,31 +669,189 @@ def destroy(instance): _py3dna.MemoryStream_swigregister(MemoryStream) def MemoryStream_create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) def MemoryStream_destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) -FileStream.__new__ = __new_decorator(FileStream_create, FileStream.__new__) -FileStream.__del__ = lambda instance: FileStream_destroy(instance) -FileStream.__init__ = __managed_init -del FileStream.create -del FileStream.destroy +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] + +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] -MemoryMappedFileStream.__new__ = __new_decorator(MemoryMappedFileStream_create, MemoryMappedFileStream.__new__) -MemoryMappedFileStream.__del__ = lambda instance: MemoryMappedFileStream_destroy(instance) -MemoryMappedFileStream.__init__ = __managed_init -del MemoryMappedFileStream.create -del MemoryMappedFileStream.destroy +MemoryMappedFileStreamImpl = MemoryMappedFileStream -MemoryStream.__new__ = __new_decorator(MemoryStream_create, MemoryStream.__new__) -MemoryStream.__del__ = lambda instance: MemoryStream_destroy(instance) -MemoryStream.__init__ = __managed_init -del MemoryStream.create -del MemoryStream.destroy +class MemoryMappedFileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] FileStream.AccessMode_Read = AccessMode_Read @@ -463,11 +895,11 @@ def __mul__(*args): def __truediv__(*args): return _py3dna.__truediv__(*args) -def __eq__(*args): - return _py3dna.__eq__(*args) +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) -def __ne__(*args): - return _py3dna.__ne__(*args) +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) DataLayer_Descriptor = _py3dna.DataLayer_Descriptor DataLayer_Definition = _py3dna.DataLayer_Definition DataLayer_Behavior = _py3dna.DataLayer_Behavior @@ -509,6 +941,13 @@ def __init__(self): _py3dna.CoordinateSystem_swigregister(CoordinateSystem) class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -531,9 +970,31 @@ def getMetaDataCount(self): return _py3dna.DescriptorReader_getMetaDataCount(self) def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ return _py3dna.DescriptorReader_getMetaDataKey(self, index) def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ return _py3dna.DescriptorReader_getMetaDataValue(self, key) def getTranslationUnit(self): @@ -546,21 +1007,44 @@ def getCoordinateSystem(self): return _py3dna.DescriptorReader_getCoordinateSystem(self) def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ return _py3dna.DescriptorReader_getLODCount(self) def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ return _py3dna.DescriptorReader_getDBMaxLOD(self) def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ return _py3dna.DescriptorReader_getDBComplexity(self) def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ return _py3dna.DescriptorReader_getDBName(self) # Register DescriptorReader in _py3dna: _py3dna.DescriptorReader_swigregister(DescriptorReader) class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) @@ -574,6 +1058,13 @@ def __init__(self): _py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -584,102 +1075,354 @@ def getGUIControlCount(self): return _py3dna.DefinitionReader_getGUIControlCount(self) def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ return _py3dna.DefinitionReader_getGUIControlName(self, index) def getRawControlCount(self): return _py3dna.DefinitionReader_getRawControlCount(self) def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ return _py3dna.DefinitionReader_getRawControlName(self, index) def getJointCount(self): return _py3dna.DefinitionReader_getJointCount(self) def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ return _py3dna.DefinitionReader_getJointName(self, index) def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getJointIndexListCount(self) def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ return _py3dna.DefinitionReader_getJointParentIndex(self, index) def getBlendShapeChannelCount(self): return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) def getAnimatedMapCount(self): return _py3dna.DefinitionReader_getAnimatedMapCount(self) def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ return _py3dna.DefinitionReader_getAnimatedMapName(self, index) def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) def getMeshCount(self): return _py3dna.DefinitionReader_getMeshCount(self) def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ return _py3dna.DefinitionReader_getMeshName(self, index) def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getMeshIndexListCount(self) def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) # Register DefinitionReader in _py3dna: _py3dna.DefinitionReader_swigregister(DefinitionReader) class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -687,96 +1430,285 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawFromValues(self) def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawToValues(self) def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawCutValues(self) def getPSDCount(self): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorReader_getPSDCount(self) def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ return _py3dna.BehaviorReader_getPSDRowIndices(self) def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ return _py3dna.BehaviorReader_getPSDColumnIndices(self) def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ return _py3dna.BehaviorReader_getPSDValues(self) def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointRowCount(self) def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointColumnCount(self) def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" return _py3dna.BehaviorReader_getJointGroupCount(self) def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getAnimatedMapLODs(self) def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapToValues(self) def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) # Register BehaviorReader in _py3dna: _py3dna.BehaviorReader_swigregister(BehaviorReader) class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -784,108 +1716,560 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getFaceCount(self, meshIndex) def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) # Register GeometryReader in _py3dna: _py3dna.GeometryReader_swigregister(GeometryReader) class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -894,6 +2278,12 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Reader def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ return _py3dna.Reader_unload(self, layer) # Register Reader in _py3dna: @@ -908,6 +2298,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamReader def read(self): + r""" read data from stream into internal structures.""" return _py3dna.StreamReader_read(self) # Register StreamReader in _py3dna: @@ -925,10 +2316,188 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamReader @@ -936,9 +2505,187 @@ def destroy(instance): _py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) def BinaryStreamReader_create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) def BinaryStreamReader_destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) class JSONStreamReader(StreamReader): @@ -950,10 +2697,31 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamReader @@ -961,26 +2729,124 @@ def destroy(instance): _py3dna.JSONStreamReader_swigregister(JSONStreamReader) def JSONStreamReader_create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) def JSONStreamReader_destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) -BinaryStreamReader.__new__ = __new_decorator(BinaryStreamReader_create, BinaryStreamReader.__new__) -BinaryStreamReader.__del__ = lambda instance: BinaryStreamReader_destroy(instance) -BinaryStreamReader.__init__ = __managed_init -del BinaryStreamReader.create -del BinaryStreamReader.destroy +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader + +class JSONStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] -JSONStreamReader.__new__ = __new_decorator(JSONStreamReader_create, JSONStreamReader.__new__) -JSONStreamReader.__del__ = lambda instance: JSONStreamReader_destroy(instance) -JSONStreamReader.__init__ = __managed_init -del JSONStreamReader.create -del JSONStreamReader.destroy +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -988,6 +2854,13 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ return _py3dna.DescriptorWriter_setName(self, name) def setArchetype(self, archetype): @@ -1000,9 +2873,23 @@ def setAge(self, age): return _py3dna.DescriptorWriter_setAge(self, age) def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" return _py3dna.DescriptorWriter_clearMetaData(self) def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ return _py3dna.DescriptorWriter_setMetaData(self, key, value) def setTranslationUnit(self, unit): @@ -1015,21 +2902,53 @@ def setCoordinateSystem(self, system): return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ return _py3dna.DescriptorWriter_setLODCount(self, lodCount) def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBComplexity(self, name) def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBName(self, name) # Register DescriptorWriter in _py3dna: _py3dna.DescriptorWriter_swigregister(DescriptorWriter) class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1037,108 +2956,392 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" return _py3dna.DefinitionWriter_clearGUIControlNames(self) def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) def clearRawControlNames(self): + r""" Delete all stored raw control names.""" return _py3dna.DefinitionWriter_clearRawControlNames(self) def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setRawControlName(self, index, name) def clearJointNames(self): + r""" Delete all stored joint names.""" return _py3dna.DefinitionWriter_clearJointNames(self) def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setJointName(self, index, name) def clearJointIndices(self): + r""" Delete all stored joint indices.""" return _py3dna.DefinitionWriter_clearJointIndices(self) def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODJointMappings(self) def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) def clearMeshNames(self): + r""" Delete all stored mesh names.""" return _py3dna.DefinitionWriter_clearMeshNames(self) def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setMeshName(self, index, name) def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" return _py3dna.DefinitionWriter_clearMeshIndices(self) def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODMeshMappings(self) def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) # Register DefinitionWriter in _py3dna: _py3dna.DefinitionWriter_swigregister(DefinitionWriter) class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1146,96 +3349,388 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorWriter_setPSDCount(self, count) def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ return _py3dna.BehaviorWriter_setPSDValues(self, weights) def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) def clearJointGroups(self): + r""" Delete all joint groups.""" return _py3dna.BehaviorWriter_clearJointGroups(self) def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) # Register BehaviorWriter in _py3dna: _py3dna.BehaviorWriter_swigregister(BehaviorWriter) class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1243,57 +3738,292 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearMeshes(self): + r""" Delete all meshes.""" return _py3dna.GeometryWriter_clearMeshes(self) def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) # Register GeometryWriter in _py3dna: _py3dna.GeometryWriter_swigregister(GeometryWriter) class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1302,6 +4032,24 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Writer def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ return _py3dna.Writer_setFrom(self, *args) # Register Writer in _py3dna: @@ -1316,6 +4064,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamWriter def write(self): + r""" Write data to stream from internal structures.""" return _py3dna.StreamWriter_write(self) # Register StreamWriter in _py3dna: @@ -1330,10 +4079,31 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamWriter @@ -1341,9 +4111,30 @@ def destroy(instance): _py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) def BinaryStreamWriter_create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) def BinaryStreamWriter_destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) class JSONStreamWriter(StreamWriter): @@ -1355,10 +4146,34 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamWriter @@ -1366,24 +4181,118 @@ def destroy(instance): _py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) def JSONStreamWriter_create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) def JSONStreamWriter_destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) -BinaryStreamWriter.__new__ = __new_decorator(BinaryStreamWriter_create, BinaryStreamWriter.__new__) -BinaryStreamWriter.__del__ = lambda instance: BinaryStreamWriter_destroy(instance) -BinaryStreamWriter.__init__ = __managed_init -del BinaryStreamWriter.create -del BinaryStreamWriter.destroy +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamWriterImpl = JSONStreamWriter + +class JSONStreamWriterImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] + +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -JSONStreamWriter.__new__ = __new_decorator(JSONStreamWriter_create, JSONStreamWriter.__new__) -JSONStreamWriter.__del__ = lambda instance: JSONStreamWriter_destroy(instance) -JSONStreamWriter.__init__ = __managed_init -del JSONStreamWriter.create -del JSONStreamWriter.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] diff --git a/lib/Maya2022/linux/dnacalib.py b/lib/Maya2022/linux/dnacalib.py index 1cff0fe2..ae9d31bc 100644 --- a/lib/Maya2022/linux/dnacalib.py +++ b/lib/Maya2022/linux/dnacalib.py @@ -4,6 +4,18 @@ # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + from sys import version_info as _swig_python_version_info if _swig_python_version_info < (2, 7, 0): raise RuntimeError("Python 2.7 or later required") @@ -62,20 +74,16 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) import dna class VersionInfo(object): @@ -142,13 +150,50 @@ def DNACalibDNAReader_destroy(instance): return _py3dnacalib.DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__new__ = __new_decorator(DNACalibDNAReader_create, DNACalibDNAReader.__new__) -DNACalibDNAReader.__del__ = lambda instance: DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__init__ = __managed_init -del DNACalibDNAReader.create -del DNACalibDNAReader.destroy +DNACalibDNAReaderImpl = DNACalibDNAReader + +class DNACalibDNAReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -167,6 +212,14 @@ def run(self, output): VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CommandSequence @@ -178,15 +231,34 @@ def run(self, output): return _py3dnacalib.CommandSequence_run(self, output) def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ return _py3dnacalib.CommandSequence_add(self, command) def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ return _py3dnacalib.CommandSequence_remove(self, command) def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ return _py3dnacalib.CommandSequence_contains(self, command) def size(self): + r""" Number of commands in command sequence.""" return _py3dnacalib.CommandSequence_size(self) # Register CommandSequence in _py3dnacalib: @@ -216,6 +288,12 @@ def wrapper(self, command): CommandSequence.remove = command_sequence_remove(CommandSequence.remove) class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand @@ -224,6 +302,12 @@ def __init__(self, *args): _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) def run(self, output): @@ -233,6 +317,11 @@ def run(self, output): _py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand @@ -247,6 +336,8 @@ def run(self, output): _py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand @@ -255,6 +346,12 @@ def __init__(self, *args): _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) def run(self, output): @@ -264,6 +361,8 @@ def run(self, output): _py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand @@ -272,9 +371,23 @@ def __init__(self, *args): _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) def run(self, output): @@ -284,6 +397,8 @@ def run(self, output): _py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand @@ -292,9 +407,23 @@ def __init__(self, *args): _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) def run(self, output): @@ -304,6 +433,8 @@ def run(self, output): _py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand @@ -312,9 +443,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -324,6 +469,8 @@ def run(self, output): _py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand @@ -332,9 +479,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -344,6 +505,8 @@ def run(self, output): _py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand @@ -352,9 +515,22 @@ def __init__(self, *args): _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) def run(self, output): @@ -364,6 +540,8 @@ def run(self, output): _py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand @@ -372,6 +550,31 @@ def __init__(self, *args): _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) def run(self, output): @@ -381,6 +584,8 @@ def run(self, output): _py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand @@ -389,6 +594,31 @@ def __init__(self, *args): _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) def run(self, output): @@ -398,6 +628,8 @@ def run(self, output): _py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand @@ -406,6 +638,31 @@ def __init__(self, *args): _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ return _py3dnacalib.RenameJointCommand_setName(self, *args) def run(self, output): @@ -415,6 +672,8 @@ def run(self, output): _py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand @@ -423,6 +682,31 @@ def __init__(self, *args): _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ return _py3dnacalib.RenameMeshCommand_setName(self, *args) def run(self, output): @@ -432,6 +716,14 @@ def run(self, output): _py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RotateCommand @@ -440,9 +732,21 @@ def __init__(self, *args): _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ return _py3dnacalib.RotateCommand_setRotation(self, degrees) def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.RotateCommand_setOrigin(self, origin) def run(self, output): @@ -452,6 +756,12 @@ def run(self, output): _py3dnacalib.RotateCommand_swigregister(RotateCommand) class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ScaleCommand @@ -460,9 +770,22 @@ def __init__(self, *args): _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ return _py3dnacalib.ScaleCommand_setScale(self, scale) def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.ScaleCommand_setOrigin(self, origin) def run(self, output): @@ -472,6 +795,8 @@ def run(self, output): _py3dnacalib.ScaleCommand_swigregister(ScaleCommand) class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand @@ -480,21 +805,85 @@ def __init__(self, *args): _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) def run(self, output): @@ -509,6 +898,8 @@ def run(self, output): SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand @@ -517,6 +908,12 @@ def __init__(self, *args): _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ return _py3dnacalib.SetLODsCommand_setLODs(self, lods) def run(self, output): @@ -526,6 +923,8 @@ def run(self, output): _py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand @@ -534,6 +933,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) def run(self, output): @@ -543,6 +965,8 @@ def run(self, output): _py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand @@ -551,6 +975,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) def run(self, output): @@ -560,6 +1007,8 @@ def run(self, output): _py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand @@ -568,15 +1017,39 @@ def __init__(self, *args): _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -586,6 +1059,8 @@ def run(self, output): _py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand @@ -594,15 +1069,67 @@ def __init__(self, *args): _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) def run(self, output): @@ -613,6 +1140,12 @@ def run(self, output): SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_TranslateCommand @@ -621,6 +1154,12 @@ def __init__(self, *args): _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ return _py3dnacalib.TranslateCommand_setTranslation(self, translation) def run(self, output): diff --git a/lib/Maya2022/linux/libdnacalib.so.6 b/lib/Maya2022/linux/libdnacalib.so.6 index 4d4a306d..4c8d8779 100644 Binary files a/lib/Maya2022/linux/libdnacalib.so.6 and b/lib/Maya2022/linux/libdnacalib.so.6 differ diff --git a/lib/Maya2022/linux/embeddedRL4.mll b/lib/Maya2022/linux/libembeddedRL4.so similarity index 100% rename from lib/Maya2022/linux/embeddedRL4.mll rename to lib/Maya2022/linux/libembeddedRL4.so diff --git a/lib/Maya2022/windows/_py3dna.pyd b/lib/Maya2022/windows/_py3dna.pyd index 7409e36c..8b613220 100644 Binary files a/lib/Maya2022/windows/_py3dna.pyd and b/lib/Maya2022/windows/_py3dna.pyd differ diff --git a/lib/Maya2022/windows/_py3dnacalib.pyd b/lib/Maya2022/windows/_py3dnacalib.pyd index 7f8daf16..daf8f578 100644 Binary files a/lib/Maya2022/windows/_py3dnacalib.pyd and b/lib/Maya2022/windows/_py3dnacalib.pyd differ diff --git a/lib/Maya2022/windows/dna.py b/lib/Maya2022/windows/dna.py index c2f0e9c6..a25f8271 100644 --- a/lib/Maya2022/windows/dna.py +++ b/lib/Maya2022/windows/dna.py @@ -1,13 +1,22 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. -from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _py3dna @@ -29,10 +38,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -62,22 +71,25 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -93,8 +105,12 @@ def deallocate(self, ptr, size, alignment): # Register MemoryResource in _py3dna: _py3dna.MemoryResource_swigregister(MemoryResource) - class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -110,8 +126,12 @@ def __init__(self): # Register AlignedMemoryResource in _py3dna: _py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) - class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dna.delete_ArenaMemoryResource @@ -120,18 +140,25 @@ def __init__(self, *args): _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) # Register ArenaMemoryResource in _py3dna: _py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) - class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -147,7 +174,6 @@ def __init__(self): # Register DefaultMemoryResource in _py3dna: _py3dna.DefaultMemoryResource_swigregister(DefaultMemoryResource) - class StatusCode(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -160,7 +186,6 @@ def __init__(self): # Register StatusCode in _py3dna: _py3dna.StatusCode_swigregister(StatusCode) - class Status(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -179,13 +204,6 @@ def __init__(self): # Register Status in _py3dna: _py3dna.Status_swigregister(Status) - -def Status_isOk(): - return _py3dna.Status_isOk() - -def Status_get(): - return _py3dna.Status_get() - class Readable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -194,11 +212,39 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ return _py3dna.Readable_read(self, *args) # Register Readable in _py3dna: _py3dna.Readable_swigregister(Readable) - class Writable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -207,11 +253,39 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ return _py3dna.Writable_write(self, *args) # Register Writable in _py3dna: _py3dna.Writable_swigregister(Writable) - class Seekable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -220,14 +294,25 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_tell(self) def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_seek(self, position) # Register Seekable in _py3dna: _py3dna.Seekable_swigregister(Seekable) - class Openable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -236,11 +321,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def open(self): + r""" Open access to the stream.""" return _py3dna.Openable_open(self) # Register Openable in _py3dna: _py3dna.Openable_swigregister(Openable) - class Closeable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -249,11 +334,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def close(self): + r""" Close access to the stream.""" return _py3dna.Closeable_close(self) # Register Closeable in _py3dna: _py3dna.Closeable_swigregister(Closeable) - class Controllable(Openable, Closeable): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -263,7 +348,6 @@ def __init__(self, *args, **kwargs): # Register Controllable in _py3dna: _py3dna.Controllable_swigregister(Controllable) - class Bounded(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -272,11 +356,16 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ return _py3dna.Bounded_size(self) # Register Bounded in _py3dna: _py3dna.Bounded_swigregister(Bounded) - class Buffered(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -285,11 +374,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def flush(self): + r""" Flush the changes to filesystem.""" return _py3dna.Buffered_flush(self) # Register Buffered in _py3dna: _py3dna.Buffered_swigregister(Buffered) - class Resizable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -298,11 +387,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def resize(self, size): + r""" Resize file to the requested size.""" return _py3dna.Resizable_resize(self, size) # Register Resizable in _py3dna: _py3dna.Resizable_swigregister(Resizable) - class BoundedIOStream(Controllable, Readable, Writable, Seekable, Bounded): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -326,6 +415,8 @@ def __init__(self, *args, **kwargs): OpenMode_Binary = _py3dna.OpenMode_Binary OpenMode_Text = _py3dna.OpenMode_Text class FileStream(BoundedIOStream): + r""" Standard file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -334,23 +425,45 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_FileStream # Register FileStream in _py3dna: _py3dna.FileStream_swigregister(FileStream) - -def FileStream_create(path, accessMode, openMode, memRes=None): - return _py3dna.FileStream_create(path, accessMode, openMode, memRes) - -def FileStream_destroy(instance): - return _py3dna.FileStream_destroy(instance) - class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -359,23 +472,42 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream # Register MemoryMappedFileStream in _py3dna: _py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) - -def MemoryMappedFileStream_create(path, accessMode, memRes=None): - return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) - -def MemoryMappedFileStream_destroy(instance): - return _py3dna.MemoryMappedFileStream_destroy(instance) - class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -384,42 +516,193 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryStream # Register MemoryStream in _py3dna: _py3dna.MemoryStream_swigregister(MemoryStream) -def MemoryStream_create(*args): - return _py3dna.MemoryStream_create(*args) +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) -def MemoryStream_destroy(instance): - return _py3dna.MemoryStream_destroy(instance) + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -FileStream.__new__ = __new_decorator(FileStream_create, FileStream.__new__) -FileStream.__del__ = lambda instance: FileStream_destroy(instance) -FileStream.__init__ = __managed_init -del FileStream.create -del FileStream.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] -MemoryMappedFileStream.__new__ = __new_decorator(MemoryMappedFileStream_create, MemoryMappedFileStream.__new__) -MemoryMappedFileStream.__del__ = lambda instance: MemoryMappedFileStream_destroy(instance) -MemoryMappedFileStream.__init__ = __managed_init -del MemoryMappedFileStream.create -del MemoryMappedFileStream.destroy +MemoryMappedFileStreamImpl = MemoryMappedFileStream +class MemoryMappedFileStreamImplReflectionMixin(type): -MemoryStream.__new__ = __new_decorator(MemoryStream_create, MemoryStream.__new__) -MemoryStream.__del__ = lambda instance: MemoryStream_destroy(instance) -MemoryStream.__init__ = __managed_init -del MemoryStream.create -del MemoryStream.destroy + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] FileStream.AccessMode_Read = AccessMode_Read @@ -450,7 +733,6 @@ def __init__(self): # Register StringView in _py3dna: _py3dna.StringView_swigregister(StringView) - def __add__(*args): return _py3dna.__add__(*args) @@ -463,11 +745,11 @@ def __mul__(*args): def __truediv__(*args): return _py3dna.__truediv__(*args) -def __eq__(*args): - return _py3dna.__eq__(*args) +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) -def __ne__(*args): - return _py3dna.__ne__(*args) +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) DataLayer_Descriptor = _py3dna.DataLayer_Descriptor DataLayer_Definition = _py3dna.DataLayer_Definition DataLayer_Behavior = _py3dna.DataLayer_Behavior @@ -507,8 +789,14 @@ def __init__(self): # Register CoordinateSystem in _py3dna: _py3dna.CoordinateSystem_swigregister(CoordinateSystem) - class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -531,9 +819,31 @@ def getMetaDataCount(self): return _py3dna.DescriptorReader_getMetaDataCount(self) def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ return _py3dna.DescriptorReader_getMetaDataKey(self, index) def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ return _py3dna.DescriptorReader_getMetaDataValue(self, key) def getTranslationUnit(self): @@ -546,21 +856,43 @@ def getCoordinateSystem(self): return _py3dna.DescriptorReader_getCoordinateSystem(self) def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ return _py3dna.DescriptorReader_getLODCount(self) def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ return _py3dna.DescriptorReader_getDBMaxLOD(self) def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ return _py3dna.DescriptorReader_getDBComplexity(self) def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ return _py3dna.DescriptorReader_getDBName(self) # Register DescriptorReader in _py3dna: _py3dna.DescriptorReader_swigregister(DescriptorReader) - class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) @@ -572,8 +904,14 @@ def __init__(self): # Register MeshBlendShapeChannelMapping in _py3dna: _py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) - class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -584,102 +922,353 @@ def getGUIControlCount(self): return _py3dna.DefinitionReader_getGUIControlCount(self) def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ return _py3dna.DefinitionReader_getGUIControlName(self, index) def getRawControlCount(self): return _py3dna.DefinitionReader_getRawControlCount(self) def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ return _py3dna.DefinitionReader_getRawControlName(self, index) def getJointCount(self): return _py3dna.DefinitionReader_getJointCount(self) def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ return _py3dna.DefinitionReader_getJointName(self, index) def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getJointIndexListCount(self) def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ return _py3dna.DefinitionReader_getJointParentIndex(self, index) def getBlendShapeChannelCount(self): return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) def getAnimatedMapCount(self): return _py3dna.DefinitionReader_getAnimatedMapCount(self) def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ return _py3dna.DefinitionReader_getAnimatedMapName(self, index) def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) def getMeshCount(self): return _py3dna.DefinitionReader_getMeshCount(self) def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ return _py3dna.DefinitionReader_getMeshName(self, index) def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getMeshIndexListCount(self) def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) # Register DefinitionReader in _py3dna: _py3dna.DefinitionReader_swigregister(DefinitionReader) - class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -687,96 +1276,284 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawFromValues(self) def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawToValues(self) def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawCutValues(self) def getPSDCount(self): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorReader_getPSDCount(self) def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ return _py3dna.BehaviorReader_getPSDRowIndices(self) def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ return _py3dna.BehaviorReader_getPSDColumnIndices(self) def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ return _py3dna.BehaviorReader_getPSDValues(self) def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointRowCount(self) def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointColumnCount(self) def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" return _py3dna.BehaviorReader_getJointGroupCount(self) def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getAnimatedMapLODs(self) def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapToValues(self) def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) # Register BehaviorReader in _py3dna: _py3dna.BehaviorReader_swigregister(BehaviorReader) - class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -784,108 +1561,559 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getFaceCount(self, meshIndex) def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) # Register GeometryReader in _py3dna: _py3dna.GeometryReader_swigregister(GeometryReader) - class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -894,11 +2122,16 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Reader def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ return _py3dna.Reader_unload(self, layer) # Register Reader in _py3dna: _py3dna.Reader_swigregister(Reader) - class StreamReader(Reader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -908,6 +2141,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamReader def read(self): + r""" read data from stream into internal structures.""" return _py3dna.StreamReader_read(self) # Register StreamReader in _py3dna: @@ -925,22 +2159,193 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamReader # Register BinaryStreamReader in _py3dna: _py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) - -def BinaryStreamReader_create(*args): - return _py3dna.BinaryStreamReader_create(*args) - -def BinaryStreamReader_destroy(instance): - return _py3dna.BinaryStreamReader_destroy(instance) - class JSONStreamReader(StreamReader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -950,37 +2355,128 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamReader # Register JSONStreamReader in _py3dna: _py3dna.JSONStreamReader_swigregister(JSONStreamReader) -def JSONStreamReader_create(stream, memRes=None): - return _py3dna.JSONStreamReader_create(stream, memRes) +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader -def JSONStreamReader_destroy(instance): - return _py3dna.JSONStreamReader_destroy(instance) +class JSONStreamReaderImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) -BinaryStreamReader.__new__ = __new_decorator(BinaryStreamReader_create, BinaryStreamReader.__new__) -BinaryStreamReader.__del__ = lambda instance: BinaryStreamReader_destroy(instance) -BinaryStreamReader.__init__ = __managed_init -del BinaryStreamReader.create -del BinaryStreamReader.destroy + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') -JSONStreamReader.__new__ = __new_decorator(JSONStreamReader_create, JSONStreamReader.__new__) -JSONStreamReader.__del__ = lambda instance: JSONStreamReader_destroy(instance) -JSONStreamReader.__init__ = __managed_init -del JSONStreamReader.create -del JSONStreamReader.destroy + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -988,6 +2484,13 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ return _py3dna.DescriptorWriter_setName(self, name) def setArchetype(self, archetype): @@ -1000,9 +2503,23 @@ def setAge(self, age): return _py3dna.DescriptorWriter_setAge(self, age) def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" return _py3dna.DescriptorWriter_clearMetaData(self) def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ return _py3dna.DescriptorWriter_setMetaData(self, key, value) def setTranslationUnit(self, unit): @@ -1015,21 +2532,52 @@ def setCoordinateSystem(self, system): return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ return _py3dna.DescriptorWriter_setLODCount(self, lodCount) def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBComplexity(self, name) def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBName(self, name) # Register DescriptorWriter in _py3dna: _py3dna.DescriptorWriter_swigregister(DescriptorWriter) - class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1037,108 +2585,391 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" return _py3dna.DefinitionWriter_clearGUIControlNames(self) def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) def clearRawControlNames(self): + r""" Delete all stored raw control names.""" return _py3dna.DefinitionWriter_clearRawControlNames(self) def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setRawControlName(self, index, name) def clearJointNames(self): + r""" Delete all stored joint names.""" return _py3dna.DefinitionWriter_clearJointNames(self) def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setJointName(self, index, name) def clearJointIndices(self): + r""" Delete all stored joint indices.""" return _py3dna.DefinitionWriter_clearJointIndices(self) def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODJointMappings(self) def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) def clearMeshNames(self): + r""" Delete all stored mesh names.""" return _py3dna.DefinitionWriter_clearMeshNames(self) def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setMeshName(self, index, name) def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" return _py3dna.DefinitionWriter_clearMeshIndices(self) def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODMeshMappings(self) def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) # Register DefinitionWriter in _py3dna: _py3dna.DefinitionWriter_swigregister(DefinitionWriter) - class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1146,96 +2977,387 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorWriter_setPSDCount(self, count) def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ return _py3dna.BehaviorWriter_setPSDValues(self, weights) def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) def clearJointGroups(self): + r""" Delete all joint groups.""" return _py3dna.BehaviorWriter_clearJointGroups(self) def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) # Register BehaviorWriter in _py3dna: _py3dna.BehaviorWriter_swigregister(BehaviorWriter) - class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1243,57 +3365,291 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearMeshes(self): + r""" Delete all meshes.""" return _py3dna.GeometryWriter_clearMeshes(self) def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) # Register GeometryWriter in _py3dna: _py3dna.GeometryWriter_swigregister(GeometryWriter) - class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1302,11 +3658,28 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Writer def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ return _py3dna.Writer_setFrom(self, *args) # Register Writer in _py3dna: _py3dna.Writer_swigregister(Writer) - class StreamWriter(Writer): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1316,11 +3689,11 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamWriter def write(self): + r""" Write data to stream from internal structures.""" return _py3dna.StreamWriter_write(self) # Register StreamWriter in _py3dna: _py3dna.StreamWriter_swigregister(StreamWriter) - class BinaryStreamWriter(StreamWriter): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1330,22 +3703,36 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamWriter # Register BinaryStreamWriter in _py3dna: _py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) - -def BinaryStreamWriter_create(stream, memRes=None): - return _py3dna.BinaryStreamWriter_create(stream, memRes) - -def BinaryStreamWriter_destroy(instance): - return _py3dna.BinaryStreamWriter_destroy(instance) - class JSONStreamWriter(StreamWriter): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1355,35 +3742,121 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamWriter # Register JSONStreamWriter in _py3dna: _py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) -def JSONStreamWriter_create(stream, indentWidth=4, memRes=None): - return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + -def JSONStreamWriter_destroy(instance): - return _py3dna.JSONStreamWriter_destroy(instance) +JSONStreamWriterImpl = JSONStreamWriter +class JSONStreamWriterImplReflectionMixin(type): -BinaryStreamWriter.__new__ = __new_decorator(BinaryStreamWriter_create, BinaryStreamWriter.__new__) -BinaryStreamWriter.__del__ = lambda instance: BinaryStreamWriter_destroy(instance) -BinaryStreamWriter.__init__ = __managed_init -del BinaryStreamWriter.create -del BinaryStreamWriter.destroy + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] -JSONStreamWriter.__new__ = __new_decorator(JSONStreamWriter_create, JSONStreamWriter.__new__) -JSONStreamWriter.__del__ = lambda instance: JSONStreamWriter_destroy(instance) -JSONStreamWriter.__init__ = __managed_init -del JSONStreamWriter.create -del JSONStreamWriter.destroy +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] diff --git a/lib/Maya2022/windows/dnacalib.dll b/lib/Maya2022/windows/dnacalib.dll index ca57f80b..d85a9262 100644 Binary files a/lib/Maya2022/windows/dnacalib.dll and b/lib/Maya2022/windows/dnacalib.dll differ diff --git a/lib/Maya2022/windows/dnacalib.py b/lib/Maya2022/windows/dnacalib.py index 8e4eca33..49cf7ee9 100644 --- a/lib/Maya2022/windows/dnacalib.py +++ b/lib/Maya2022/windows/dnacalib.py @@ -1,13 +1,22 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. -from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _py3dnacalib @@ -29,10 +38,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -62,20 +71,16 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) import dna class VersionInfo(object): @@ -104,19 +109,6 @@ def __init__(self): # Register VersionInfo in _py3dnacalib: _py3dnacalib.VersionInfo_swigregister(VersionInfo) - -def VersionInfo_getMajorVersion(): - return _py3dnacalib.VersionInfo_getMajorVersion() - -def VersionInfo_getMinorVersion(): - return _py3dnacalib.VersionInfo_getMinorVersion() - -def VersionInfo_getPatchVersion(): - return _py3dnacalib.VersionInfo_getPatchVersion() - -def VersionInfo_getVersionString(): - return _py3dnacalib.VersionInfo_getVersionString() - class DNACalibDNAReader(dna.Reader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -135,20 +127,50 @@ def destroy(instance): # Register DNACalibDNAReader in _py3dnacalib: _py3dnacalib.DNACalibDNAReader_swigregister(DNACalibDNAReader) -def DNACalibDNAReader_create(*args): - return _py3dnacalib.DNACalibDNAReader_create(*args) +DNACalibDNAReaderImpl = DNACalibDNAReader -def DNACalibDNAReader_destroy(instance): - return _py3dnacalib.DNACalibDNAReader_destroy(instance) +class DNACalibDNAReaderImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -DNACalibDNAReader.__new__ = __new_decorator(DNACalibDNAReader_create, DNACalibDNAReader.__new__) -DNACalibDNAReader.__del__ = lambda instance: DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__init__ = __managed_init -del DNACalibDNAReader.create -del DNACalibDNAReader.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -161,12 +183,19 @@ def run(self, output): # Register Command in _py3dnacalib: _py3dnacalib.Command_swigregister(Command) - VectorOperation_Interpolate = _py3dnacalib.VectorOperation_Interpolate VectorOperation_Add = _py3dnacalib.VectorOperation_Add VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CommandSequence @@ -178,21 +207,39 @@ def run(self, output): return _py3dnacalib.CommandSequence_run(self, output) def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ return _py3dnacalib.CommandSequence_add(self, command) def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ return _py3dnacalib.CommandSequence_remove(self, command) def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ return _py3dnacalib.CommandSequence_contains(self, command) def size(self): + r""" Number of commands in command sequence.""" return _py3dnacalib.CommandSequence_size(self) # Register CommandSequence in _py3dnacalib: _py3dnacalib.CommandSequence_swigregister(CommandSequence) - def command_sequence_init(_init): def wrapper(self, *args, **kwargs): self._commands = [] @@ -216,6 +263,12 @@ def wrapper(self, command): CommandSequence.remove = command_sequence_remove(CommandSequence.remove) class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand @@ -224,6 +277,12 @@ def __init__(self, *args): _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) def run(self, output): @@ -231,8 +290,12 @@ def run(self, output): # Register CalculateMeshLowerLODsCommand in _py3dnacalib: _py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) - class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand @@ -245,8 +308,9 @@ def run(self, output): # Register ClearBlendShapesCommand in _py3dnacalib: _py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) - class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand @@ -255,6 +319,12 @@ def __init__(self, *args): _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) def run(self, output): @@ -262,8 +332,9 @@ def run(self, output): # Register PruneBlendShapeTargetsCommand in _py3dnacalib: _py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) - class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand @@ -272,9 +343,23 @@ def __init__(self, *args): _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) def run(self, output): @@ -282,8 +367,9 @@ def run(self, output): # Register RemoveAnimatedMapCommand in _py3dnacalib: _py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) - class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand @@ -292,9 +378,23 @@ def __init__(self, *args): _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) def run(self, output): @@ -302,8 +402,9 @@ def run(self, output): # Register RemoveBlendShapeCommand in _py3dnacalib: _py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) - class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand @@ -312,9 +413,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -322,8 +437,9 @@ def run(self, output): # Register RemoveJointAnimationCommand in _py3dnacalib: _py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) - class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand @@ -332,9 +448,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -342,8 +472,9 @@ def run(self, output): # Register RemoveJointCommand in _py3dnacalib: _py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) - class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand @@ -352,9 +483,22 @@ def __init__(self, *args): _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) def run(self, output): @@ -362,8 +506,9 @@ def run(self, output): # Register RemoveMeshCommand in _py3dnacalib: _py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) - class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand @@ -372,6 +517,31 @@ def __init__(self, *args): _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) def run(self, output): @@ -379,8 +549,9 @@ def run(self, output): # Register RenameAnimatedMapCommand in _py3dnacalib: _py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) - class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand @@ -389,6 +560,31 @@ def __init__(self, *args): _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) def run(self, output): @@ -396,8 +592,9 @@ def run(self, output): # Register RenameBlendShapeCommand in _py3dnacalib: _py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) - class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand @@ -406,6 +603,31 @@ def __init__(self, *args): _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ return _py3dnacalib.RenameJointCommand_setName(self, *args) def run(self, output): @@ -413,8 +635,9 @@ def run(self, output): # Register RenameJointCommand in _py3dnacalib: _py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) - class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand @@ -423,6 +646,31 @@ def __init__(self, *args): _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ return _py3dnacalib.RenameMeshCommand_setName(self, *args) def run(self, output): @@ -430,8 +678,15 @@ def run(self, output): # Register RenameMeshCommand in _py3dnacalib: _py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) - class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RotateCommand @@ -440,9 +695,21 @@ def __init__(self, *args): _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ return _py3dnacalib.RotateCommand_setRotation(self, degrees) def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.RotateCommand_setOrigin(self, origin) def run(self, output): @@ -450,8 +717,13 @@ def run(self, output): # Register RotateCommand in _py3dnacalib: _py3dnacalib.RotateCommand_swigregister(RotateCommand) - class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ScaleCommand @@ -460,9 +732,22 @@ def __init__(self, *args): _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ return _py3dnacalib.ScaleCommand_setScale(self, scale) def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.ScaleCommand_setOrigin(self, origin) def run(self, output): @@ -470,8 +755,9 @@ def run(self, output): # Register ScaleCommand in _py3dnacalib: _py3dnacalib.ScaleCommand_swigregister(ScaleCommand) - class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand @@ -480,21 +766,85 @@ def __init__(self, *args): _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) def run(self, output): @@ -509,6 +859,8 @@ def run(self, output): SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand @@ -517,6 +869,12 @@ def __init__(self, *args): _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ return _py3dnacalib.SetLODsCommand_setLODs(self, lods) def run(self, output): @@ -524,8 +882,9 @@ def run(self, output): # Register SetLODsCommand in _py3dnacalib: _py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) - class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand @@ -534,6 +893,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) def run(self, output): @@ -541,8 +923,9 @@ def run(self, output): # Register SetNeutralJointRotationsCommand in _py3dnacalib: _py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) - class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand @@ -551,6 +934,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) def run(self, output): @@ -558,8 +964,9 @@ def run(self, output): # Register SetNeutralJointTranslationsCommand in _py3dnacalib: _py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) - class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand @@ -568,15 +975,39 @@ def __init__(self, *args): _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -584,8 +1015,9 @@ def run(self, output): # Register SetSkinWeightsCommand in _py3dnacalib: _py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) - class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand @@ -594,15 +1026,67 @@ def __init__(self, *args): _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) def run(self, output): @@ -613,6 +1097,12 @@ def run(self, output): SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_TranslateCommand @@ -621,6 +1111,12 @@ def __init__(self, *args): _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ return _py3dnacalib.TranslateCommand_setTranslation(self, translation) def run(self, output): @@ -629,5 +1125,3 @@ def run(self, output): # Register TranslateCommand in _py3dnacalib: _py3dnacalib.TranslateCommand_swigregister(TranslateCommand) - - diff --git a/lib/Maya2023/linux/_py3dna.so b/lib/Maya2023/linux/_py3dna.so index 264a13fc..1b5943d7 100644 Binary files a/lib/Maya2023/linux/_py3dna.so and b/lib/Maya2023/linux/_py3dna.so differ diff --git a/lib/Maya2023/linux/_py3dnacalib.so b/lib/Maya2023/linux/_py3dnacalib.so index 3cede278..90ea1da9 100644 Binary files a/lib/Maya2023/linux/_py3dnacalib.so and b/lib/Maya2023/linux/_py3dnacalib.so differ diff --git a/lib/Maya2023/linux/dna.py b/lib/Maya2023/linux/dna.py index 10915cd2..ed8fbaa0 100644 --- a/lib/Maya2023/linux/dna.py +++ b/lib/Maya2023/linux/dna.py @@ -4,6 +4,18 @@ # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + from sys import version_info as _swig_python_version_info if _swig_python_version_info < (2, 7, 0): raise RuntimeError("Python 2.7 or later required") @@ -62,22 +74,25 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -95,6 +110,11 @@ def deallocate(self, ptr, size, alignment): _py3dna.MemoryResource_swigregister(MemoryResource) class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -112,6 +132,11 @@ def __init__(self): _py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dna.delete_ArenaMemoryResource @@ -120,18 +145,26 @@ def __init__(self, *args): _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) # Register ArenaMemoryResource in _py3dna: _py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -194,6 +227,35 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ return _py3dna.Readable_read(self, *args) # Register Readable in _py3dna: @@ -207,6 +269,35 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ return _py3dna.Writable_write(self, *args) # Register Writable in _py3dna: @@ -220,9 +311,21 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_tell(self) def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_seek(self, position) # Register Seekable in _py3dna: @@ -236,6 +339,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def open(self): + r""" Open access to the stream.""" return _py3dna.Openable_open(self) # Register Openable in _py3dna: @@ -249,6 +353,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def close(self): + r""" Close access to the stream.""" return _py3dna.Closeable_close(self) # Register Closeable in _py3dna: @@ -272,6 +377,12 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ return _py3dna.Bounded_size(self) # Register Bounded in _py3dna: @@ -285,6 +396,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def flush(self): + r""" Flush the changes to filesystem.""" return _py3dna.Buffered_flush(self) # Register Buffered in _py3dna: @@ -298,6 +410,7 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def resize(self, size): + r""" Resize file to the requested size.""" return _py3dna.Resizable_resize(self, size) # Register Resizable in _py3dna: @@ -326,6 +439,8 @@ def __init__(self, *args, **kwargs): OpenMode_Binary = _py3dna.OpenMode_Binary OpenMode_Text = _py3dna.OpenMode_Text class FileStream(BoundedIOStream): + r""" Standard file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -334,10 +449,37 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_FileStream @@ -345,12 +487,41 @@ def destroy(instance): _py3dna.FileStream_swigregister(FileStream) def FileStream_create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) def FileStream_destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -359,10 +530,34 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream @@ -370,12 +565,38 @@ def destroy(instance): _py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) def MemoryMappedFileStream_create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) def MemoryMappedFileStream_destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -384,10 +605,63 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryStream @@ -395,31 +669,189 @@ def destroy(instance): _py3dna.MemoryStream_swigregister(MemoryStream) def MemoryStream_create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) def MemoryStream_destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) -FileStream.__new__ = __new_decorator(FileStream_create, FileStream.__new__) -FileStream.__del__ = lambda instance: FileStream_destroy(instance) -FileStream.__init__ = __managed_init -del FileStream.create -del FileStream.destroy +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] + +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] -MemoryMappedFileStream.__new__ = __new_decorator(MemoryMappedFileStream_create, MemoryMappedFileStream.__new__) -MemoryMappedFileStream.__del__ = lambda instance: MemoryMappedFileStream_destroy(instance) -MemoryMappedFileStream.__init__ = __managed_init -del MemoryMappedFileStream.create -del MemoryMappedFileStream.destroy +MemoryMappedFileStreamImpl = MemoryMappedFileStream -MemoryStream.__new__ = __new_decorator(MemoryStream_create, MemoryStream.__new__) -MemoryStream.__del__ = lambda instance: MemoryStream_destroy(instance) -MemoryStream.__init__ = __managed_init -del MemoryStream.create -del MemoryStream.destroy +class MemoryMappedFileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] FileStream.AccessMode_Read = AccessMode_Read @@ -463,11 +895,11 @@ def __mul__(*args): def __truediv__(*args): return _py3dna.__truediv__(*args) -def __eq__(*args): - return _py3dna.__eq__(*args) +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) -def __ne__(*args): - return _py3dna.__ne__(*args) +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) DataLayer_Descriptor = _py3dna.DataLayer_Descriptor DataLayer_Definition = _py3dna.DataLayer_Definition DataLayer_Behavior = _py3dna.DataLayer_Behavior @@ -509,6 +941,13 @@ def __init__(self): _py3dna.CoordinateSystem_swigregister(CoordinateSystem) class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -531,9 +970,31 @@ def getMetaDataCount(self): return _py3dna.DescriptorReader_getMetaDataCount(self) def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ return _py3dna.DescriptorReader_getMetaDataKey(self, index) def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ return _py3dna.DescriptorReader_getMetaDataValue(self, key) def getTranslationUnit(self): @@ -546,21 +1007,44 @@ def getCoordinateSystem(self): return _py3dna.DescriptorReader_getCoordinateSystem(self) def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ return _py3dna.DescriptorReader_getLODCount(self) def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ return _py3dna.DescriptorReader_getDBMaxLOD(self) def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ return _py3dna.DescriptorReader_getDBComplexity(self) def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ return _py3dna.DescriptorReader_getDBName(self) # Register DescriptorReader in _py3dna: _py3dna.DescriptorReader_swigregister(DescriptorReader) class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) @@ -574,6 +1058,13 @@ def __init__(self): _py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -584,102 +1075,354 @@ def getGUIControlCount(self): return _py3dna.DefinitionReader_getGUIControlCount(self) def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ return _py3dna.DefinitionReader_getGUIControlName(self, index) def getRawControlCount(self): return _py3dna.DefinitionReader_getRawControlCount(self) def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ return _py3dna.DefinitionReader_getRawControlName(self, index) def getJointCount(self): return _py3dna.DefinitionReader_getJointCount(self) def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ return _py3dna.DefinitionReader_getJointName(self, index) def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getJointIndexListCount(self) def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ return _py3dna.DefinitionReader_getJointParentIndex(self, index) def getBlendShapeChannelCount(self): return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) def getAnimatedMapCount(self): return _py3dna.DefinitionReader_getAnimatedMapCount(self) def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ return _py3dna.DefinitionReader_getAnimatedMapName(self, index) def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) def getMeshCount(self): return _py3dna.DefinitionReader_getMeshCount(self) def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ return _py3dna.DefinitionReader_getMeshName(self, index) def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getMeshIndexListCount(self) def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) # Register DefinitionReader in _py3dna: _py3dna.DefinitionReader_swigregister(DefinitionReader) class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -687,96 +1430,285 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawFromValues(self) def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawToValues(self) def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawCutValues(self) def getPSDCount(self): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorReader_getPSDCount(self) def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ return _py3dna.BehaviorReader_getPSDRowIndices(self) def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ return _py3dna.BehaviorReader_getPSDColumnIndices(self) def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ return _py3dna.BehaviorReader_getPSDValues(self) def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointRowCount(self) def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointColumnCount(self) def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" return _py3dna.BehaviorReader_getJointGroupCount(self) def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getAnimatedMapLODs(self) def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapToValues(self) def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) # Register BehaviorReader in _py3dna: _py3dna.BehaviorReader_swigregister(BehaviorReader) class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -784,108 +1716,560 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getFaceCount(self, meshIndex) def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) # Register GeometryReader in _py3dna: _py3dna.GeometryReader_swigregister(GeometryReader) class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -894,6 +2278,12 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Reader def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ return _py3dna.Reader_unload(self, layer) # Register Reader in _py3dna: @@ -908,6 +2298,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamReader def read(self): + r""" read data from stream into internal structures.""" return _py3dna.StreamReader_read(self) # Register StreamReader in _py3dna: @@ -925,10 +2316,188 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamReader @@ -936,9 +2505,187 @@ def destroy(instance): _py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) def BinaryStreamReader_create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) def BinaryStreamReader_destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) class JSONStreamReader(StreamReader): @@ -950,10 +2697,31 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamReader @@ -961,26 +2729,124 @@ def destroy(instance): _py3dna.JSONStreamReader_swigregister(JSONStreamReader) def JSONStreamReader_create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) def JSONStreamReader_destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) -BinaryStreamReader.__new__ = __new_decorator(BinaryStreamReader_create, BinaryStreamReader.__new__) -BinaryStreamReader.__del__ = lambda instance: BinaryStreamReader_destroy(instance) -BinaryStreamReader.__init__ = __managed_init -del BinaryStreamReader.create -del BinaryStreamReader.destroy +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader + +class JSONStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] -JSONStreamReader.__new__ = __new_decorator(JSONStreamReader_create, JSONStreamReader.__new__) -JSONStreamReader.__del__ = lambda instance: JSONStreamReader_destroy(instance) -JSONStreamReader.__init__ = __managed_init -del JSONStreamReader.create -del JSONStreamReader.destroy +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -988,6 +2854,13 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ return _py3dna.DescriptorWriter_setName(self, name) def setArchetype(self, archetype): @@ -1000,9 +2873,23 @@ def setAge(self, age): return _py3dna.DescriptorWriter_setAge(self, age) def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" return _py3dna.DescriptorWriter_clearMetaData(self) def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ return _py3dna.DescriptorWriter_setMetaData(self, key, value) def setTranslationUnit(self, unit): @@ -1015,21 +2902,53 @@ def setCoordinateSystem(self, system): return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ return _py3dna.DescriptorWriter_setLODCount(self, lodCount) def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBComplexity(self, name) def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBName(self, name) # Register DescriptorWriter in _py3dna: _py3dna.DescriptorWriter_swigregister(DescriptorWriter) class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1037,108 +2956,392 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" return _py3dna.DefinitionWriter_clearGUIControlNames(self) def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) def clearRawControlNames(self): + r""" Delete all stored raw control names.""" return _py3dna.DefinitionWriter_clearRawControlNames(self) def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setRawControlName(self, index, name) def clearJointNames(self): + r""" Delete all stored joint names.""" return _py3dna.DefinitionWriter_clearJointNames(self) def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setJointName(self, index, name) def clearJointIndices(self): + r""" Delete all stored joint indices.""" return _py3dna.DefinitionWriter_clearJointIndices(self) def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODJointMappings(self) def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) def clearMeshNames(self): + r""" Delete all stored mesh names.""" return _py3dna.DefinitionWriter_clearMeshNames(self) def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setMeshName(self, index, name) def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" return _py3dna.DefinitionWriter_clearMeshIndices(self) def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODMeshMappings(self) def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) # Register DefinitionWriter in _py3dna: _py3dna.DefinitionWriter_swigregister(DefinitionWriter) class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1146,96 +3349,388 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorWriter_setPSDCount(self, count) def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ return _py3dna.BehaviorWriter_setPSDValues(self, weights) def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) def clearJointGroups(self): + r""" Delete all joint groups.""" return _py3dna.BehaviorWriter_clearJointGroups(self) def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) # Register BehaviorWriter in _py3dna: _py3dna.BehaviorWriter_swigregister(BehaviorWriter) class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1243,57 +3738,292 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearMeshes(self): + r""" Delete all meshes.""" return _py3dna.GeometryWriter_clearMeshes(self) def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) # Register GeometryWriter in _py3dna: _py3dna.GeometryWriter_swigregister(GeometryWriter) class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1302,6 +4032,24 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Writer def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ return _py3dna.Writer_setFrom(self, *args) # Register Writer in _py3dna: @@ -1316,6 +4064,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamWriter def write(self): + r""" Write data to stream from internal structures.""" return _py3dna.StreamWriter_write(self) # Register StreamWriter in _py3dna: @@ -1330,10 +4079,31 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamWriter @@ -1341,9 +4111,30 @@ def destroy(instance): _py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) def BinaryStreamWriter_create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) def BinaryStreamWriter_destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) class JSONStreamWriter(StreamWriter): @@ -1355,10 +4146,34 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamWriter @@ -1366,24 +4181,118 @@ def destroy(instance): _py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) def JSONStreamWriter_create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) def JSONStreamWriter_destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) -BinaryStreamWriter.__new__ = __new_decorator(BinaryStreamWriter_create, BinaryStreamWriter.__new__) -BinaryStreamWriter.__del__ = lambda instance: BinaryStreamWriter_destroy(instance) -BinaryStreamWriter.__init__ = __managed_init -del BinaryStreamWriter.create -del BinaryStreamWriter.destroy +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamWriterImpl = JSONStreamWriter + +class JSONStreamWriterImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] + +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -JSONStreamWriter.__new__ = __new_decorator(JSONStreamWriter_create, JSONStreamWriter.__new__) -JSONStreamWriter.__del__ = lambda instance: JSONStreamWriter_destroy(instance) -JSONStreamWriter.__init__ = __managed_init -del JSONStreamWriter.create -del JSONStreamWriter.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] diff --git a/lib/Maya2023/linux/dnacalib.py b/lib/Maya2023/linux/dnacalib.py index 1cff0fe2..ae9d31bc 100644 --- a/lib/Maya2023/linux/dnacalib.py +++ b/lib/Maya2023/linux/dnacalib.py @@ -4,6 +4,18 @@ # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + from sys import version_info as _swig_python_version_info if _swig_python_version_info < (2, 7, 0): raise RuntimeError("Python 2.7 or later required") @@ -62,20 +74,16 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) import dna class VersionInfo(object): @@ -142,13 +150,50 @@ def DNACalibDNAReader_destroy(instance): return _py3dnacalib.DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__new__ = __new_decorator(DNACalibDNAReader_create, DNACalibDNAReader.__new__) -DNACalibDNAReader.__del__ = lambda instance: DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__init__ = __managed_init -del DNACalibDNAReader.create -del DNACalibDNAReader.destroy +DNACalibDNAReaderImpl = DNACalibDNAReader + +class DNACalibDNAReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -167,6 +212,14 @@ def run(self, output): VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CommandSequence @@ -178,15 +231,34 @@ def run(self, output): return _py3dnacalib.CommandSequence_run(self, output) def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ return _py3dnacalib.CommandSequence_add(self, command) def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ return _py3dnacalib.CommandSequence_remove(self, command) def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ return _py3dnacalib.CommandSequence_contains(self, command) def size(self): + r""" Number of commands in command sequence.""" return _py3dnacalib.CommandSequence_size(self) # Register CommandSequence in _py3dnacalib: @@ -216,6 +288,12 @@ def wrapper(self, command): CommandSequence.remove = command_sequence_remove(CommandSequence.remove) class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand @@ -224,6 +302,12 @@ def __init__(self, *args): _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) def run(self, output): @@ -233,6 +317,11 @@ def run(self, output): _py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand @@ -247,6 +336,8 @@ def run(self, output): _py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand @@ -255,6 +346,12 @@ def __init__(self, *args): _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) def run(self, output): @@ -264,6 +361,8 @@ def run(self, output): _py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand @@ -272,9 +371,23 @@ def __init__(self, *args): _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) def run(self, output): @@ -284,6 +397,8 @@ def run(self, output): _py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand @@ -292,9 +407,23 @@ def __init__(self, *args): _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) def run(self, output): @@ -304,6 +433,8 @@ def run(self, output): _py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand @@ -312,9 +443,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -324,6 +469,8 @@ def run(self, output): _py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand @@ -332,9 +479,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -344,6 +505,8 @@ def run(self, output): _py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand @@ -352,9 +515,22 @@ def __init__(self, *args): _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) def run(self, output): @@ -364,6 +540,8 @@ def run(self, output): _py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand @@ -372,6 +550,31 @@ def __init__(self, *args): _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) def run(self, output): @@ -381,6 +584,8 @@ def run(self, output): _py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand @@ -389,6 +594,31 @@ def __init__(self, *args): _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) def run(self, output): @@ -398,6 +628,8 @@ def run(self, output): _py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand @@ -406,6 +638,31 @@ def __init__(self, *args): _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ return _py3dnacalib.RenameJointCommand_setName(self, *args) def run(self, output): @@ -415,6 +672,8 @@ def run(self, output): _py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand @@ -423,6 +682,31 @@ def __init__(self, *args): _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ return _py3dnacalib.RenameMeshCommand_setName(self, *args) def run(self, output): @@ -432,6 +716,14 @@ def run(self, output): _py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RotateCommand @@ -440,9 +732,21 @@ def __init__(self, *args): _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ return _py3dnacalib.RotateCommand_setRotation(self, degrees) def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.RotateCommand_setOrigin(self, origin) def run(self, output): @@ -452,6 +756,12 @@ def run(self, output): _py3dnacalib.RotateCommand_swigregister(RotateCommand) class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ScaleCommand @@ -460,9 +770,22 @@ def __init__(self, *args): _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ return _py3dnacalib.ScaleCommand_setScale(self, scale) def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.ScaleCommand_setOrigin(self, origin) def run(self, output): @@ -472,6 +795,8 @@ def run(self, output): _py3dnacalib.ScaleCommand_swigregister(ScaleCommand) class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand @@ -480,21 +805,85 @@ def __init__(self, *args): _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) def run(self, output): @@ -509,6 +898,8 @@ def run(self, output): SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand @@ -517,6 +908,12 @@ def __init__(self, *args): _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ return _py3dnacalib.SetLODsCommand_setLODs(self, lods) def run(self, output): @@ -526,6 +923,8 @@ def run(self, output): _py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand @@ -534,6 +933,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) def run(self, output): @@ -543,6 +965,8 @@ def run(self, output): _py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand @@ -551,6 +975,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) def run(self, output): @@ -560,6 +1007,8 @@ def run(self, output): _py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand @@ -568,15 +1017,39 @@ def __init__(self, *args): _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -586,6 +1059,8 @@ def run(self, output): _py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand @@ -594,15 +1069,67 @@ def __init__(self, *args): _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) def run(self, output): @@ -613,6 +1140,12 @@ def run(self, output): SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_TranslateCommand @@ -621,6 +1154,12 @@ def __init__(self, *args): _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ return _py3dnacalib.TranslateCommand_setTranslation(self, translation) def run(self, output): diff --git a/lib/Maya2023/linux/libdnacalib.so.6 b/lib/Maya2023/linux/libdnacalib.so.6 index 4d4a306d..4c8d8779 100644 Binary files a/lib/Maya2023/linux/libdnacalib.so.6 and b/lib/Maya2023/linux/libdnacalib.so.6 differ diff --git a/lib/Maya2023/linux/embeddedRL4.mll b/lib/Maya2023/linux/libembeddedRL4.so similarity index 100% rename from lib/Maya2023/linux/embeddedRL4.mll rename to lib/Maya2023/linux/libembeddedRL4.so diff --git a/lib/Maya2023/windows/_py3dna.pyd b/lib/Maya2023/windows/_py3dna.pyd index 802406bc..114e1e63 100644 Binary files a/lib/Maya2023/windows/_py3dna.pyd and b/lib/Maya2023/windows/_py3dna.pyd differ diff --git a/lib/Maya2023/windows/_py3dnacalib.pyd b/lib/Maya2023/windows/_py3dnacalib.pyd index 27ed4914..9cc29b18 100644 Binary files a/lib/Maya2023/windows/_py3dnacalib.pyd and b/lib/Maya2023/windows/_py3dnacalib.pyd differ diff --git a/lib/Maya2023/windows/dna.py b/lib/Maya2023/windows/dna.py index c2f0e9c6..a25f8271 100644 --- a/lib/Maya2023/windows/dna.py +++ b/lib/Maya2023/windows/dna.py @@ -1,13 +1,22 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. -from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _py3dna @@ -29,10 +38,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -62,22 +71,25 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -93,8 +105,12 @@ def deallocate(self, ptr, size, alignment): # Register MemoryResource in _py3dna: _py3dna.MemoryResource_swigregister(MemoryResource) - class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -110,8 +126,12 @@ def __init__(self): # Register AlignedMemoryResource in _py3dna: _py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) - class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dna.delete_ArenaMemoryResource @@ -120,18 +140,25 @@ def __init__(self, *args): _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) # Register ArenaMemoryResource in _py3dna: _py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) - class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -147,7 +174,6 @@ def __init__(self): # Register DefaultMemoryResource in _py3dna: _py3dna.DefaultMemoryResource_swigregister(DefaultMemoryResource) - class StatusCode(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -160,7 +186,6 @@ def __init__(self): # Register StatusCode in _py3dna: _py3dna.StatusCode_swigregister(StatusCode) - class Status(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr @@ -179,13 +204,6 @@ def __init__(self): # Register Status in _py3dna: _py3dna.Status_swigregister(Status) - -def Status_isOk(): - return _py3dna.Status_isOk() - -def Status_get(): - return _py3dna.Status_get() - class Readable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -194,11 +212,39 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ return _py3dna.Readable_read(self, *args) # Register Readable in _py3dna: _py3dna.Readable_swigregister(Readable) - class Writable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -207,11 +253,39 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ return _py3dna.Writable_write(self, *args) # Register Writable in _py3dna: _py3dna.Writable_swigregister(Writable) - class Seekable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -220,14 +294,25 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_tell(self) def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ return _py3dna.Seekable_seek(self, position) # Register Seekable in _py3dna: _py3dna.Seekable_swigregister(Seekable) - class Openable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -236,11 +321,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def open(self): + r""" Open access to the stream.""" return _py3dna.Openable_open(self) # Register Openable in _py3dna: _py3dna.Openable_swigregister(Openable) - class Closeable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -249,11 +334,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def close(self): + r""" Close access to the stream.""" return _py3dna.Closeable_close(self) # Register Closeable in _py3dna: _py3dna.Closeable_swigregister(Closeable) - class Controllable(Openable, Closeable): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -263,7 +348,6 @@ def __init__(self, *args, **kwargs): # Register Controllable in _py3dna: _py3dna.Controllable_swigregister(Controllable) - class Bounded(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -272,11 +356,16 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ return _py3dna.Bounded_size(self) # Register Bounded in _py3dna: _py3dna.Bounded_swigregister(Bounded) - class Buffered(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -285,11 +374,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def flush(self): + r""" Flush the changes to filesystem.""" return _py3dna.Buffered_flush(self) # Register Buffered in _py3dna: _py3dna.Buffered_swigregister(Buffered) - class Resizable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -298,11 +387,11 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def resize(self, size): + r""" Resize file to the requested size.""" return _py3dna.Resizable_resize(self, size) # Register Resizable in _py3dna: _py3dna.Resizable_swigregister(Resizable) - class BoundedIOStream(Controllable, Readable, Writable, Seekable, Bounded): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -326,6 +415,8 @@ def __init__(self, *args, **kwargs): OpenMode_Binary = _py3dna.OpenMode_Binary OpenMode_Text = _py3dna.OpenMode_Text class FileStream(BoundedIOStream): + r""" Standard file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -334,23 +425,45 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.FileStream_create(path, accessMode, openMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ return _py3dna.FileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_FileStream # Register FileStream in _py3dna: _py3dna.FileStream_swigregister(FileStream) - -def FileStream_create(path, accessMode, openMode, memRes=None): - return _py3dna.FileStream_create(path, accessMode, openMode, memRes) - -def FileStream_destroy(instance): - return _py3dna.FileStream_destroy(instance) - class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -359,23 +472,42 @@ def __init__(self, *args, **kwargs): @staticmethod def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ return _py3dna.MemoryMappedFileStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream # Register MemoryMappedFileStream in _py3dna: _py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) - -def MemoryMappedFileStream_create(path, accessMode, memRes=None): - return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) - -def MemoryMappedFileStream_destroy(instance): - return _py3dna.MemoryMappedFileStream_destroy(instance) - class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -384,42 +516,193 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.MemoryStream_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ return _py3dna.MemoryStream_destroy(instance) __swig_destroy__ = _py3dna.delete_MemoryStream # Register MemoryStream in _py3dna: _py3dna.MemoryStream_swigregister(MemoryStream) -def MemoryStream_create(*args): - return _py3dna.MemoryStream_create(*args) +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) -def MemoryStream_destroy(instance): - return _py3dna.MemoryStream_destroy(instance) + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -FileStream.__new__ = __new_decorator(FileStream_create, FileStream.__new__) -FileStream.__del__ = lambda instance: FileStream_destroy(instance) -FileStream.__init__ = __managed_init -del FileStream.create -del FileStream.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] -MemoryMappedFileStream.__new__ = __new_decorator(MemoryMappedFileStream_create, MemoryMappedFileStream.__new__) -MemoryMappedFileStream.__del__ = lambda instance: MemoryMappedFileStream_destroy(instance) -MemoryMappedFileStream.__init__ = __managed_init -del MemoryMappedFileStream.create -del MemoryMappedFileStream.destroy +MemoryMappedFileStreamImpl = MemoryMappedFileStream +class MemoryMappedFileStreamImplReflectionMixin(type): -MemoryStream.__new__ = __new_decorator(MemoryStream_create, MemoryStream.__new__) -MemoryStream.__del__ = lambda instance: MemoryStream_destroy(instance) -MemoryStream.__init__ = __managed_init -del MemoryStream.create -del MemoryStream.destroy + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] FileStream.AccessMode_Read = AccessMode_Read @@ -450,7 +733,6 @@ def __init__(self): # Register StringView in _py3dna: _py3dna.StringView_swigregister(StringView) - def __add__(*args): return _py3dna.__add__(*args) @@ -463,11 +745,11 @@ def __mul__(*args): def __truediv__(*args): return _py3dna.__truediv__(*args) -def __eq__(*args): - return _py3dna.__eq__(*args) +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) -def __ne__(*args): - return _py3dna.__ne__(*args) +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) DataLayer_Descriptor = _py3dna.DataLayer_Descriptor DataLayer_Definition = _py3dna.DataLayer_Definition DataLayer_Behavior = _py3dna.DataLayer_Behavior @@ -507,8 +789,14 @@ def __init__(self): # Register CoordinateSystem in _py3dna: _py3dna.CoordinateSystem_swigregister(CoordinateSystem) - class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -531,9 +819,31 @@ def getMetaDataCount(self): return _py3dna.DescriptorReader_getMetaDataCount(self) def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ return _py3dna.DescriptorReader_getMetaDataKey(self, index) def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ return _py3dna.DescriptorReader_getMetaDataValue(self, key) def getTranslationUnit(self): @@ -546,21 +856,43 @@ def getCoordinateSystem(self): return _py3dna.DescriptorReader_getCoordinateSystem(self) def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ return _py3dna.DescriptorReader_getLODCount(self) def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ return _py3dna.DescriptorReader_getDBMaxLOD(self) def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ return _py3dna.DescriptorReader_getDBComplexity(self) def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ return _py3dna.DescriptorReader_getDBName(self) # Register DescriptorReader in _py3dna: _py3dna.DescriptorReader_swigregister(DescriptorReader) - class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) @@ -572,8 +904,14 @@ def __init__(self): # Register MeshBlendShapeChannelMapping in _py3dna: _py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) - class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -584,102 +922,353 @@ def getGUIControlCount(self): return _py3dna.DefinitionReader_getGUIControlCount(self) def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ return _py3dna.DefinitionReader_getGUIControlName(self, index) def getRawControlCount(self): return _py3dna.DefinitionReader_getRawControlCount(self) def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ return _py3dna.DefinitionReader_getRawControlName(self, index) def getJointCount(self): return _py3dna.DefinitionReader_getJointCount(self) def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ return _py3dna.DefinitionReader_getJointName(self, index) def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getJointIndexListCount(self) def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ return _py3dna.DefinitionReader_getJointParentIndex(self, index) def getBlendShapeChannelCount(self): return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) def getAnimatedMapCount(self): return _py3dna.DefinitionReader_getAnimatedMapCount(self) def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ return _py3dna.DefinitionReader_getAnimatedMapName(self, index) def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) def getMeshCount(self): return _py3dna.DefinitionReader_getMeshCount(self) def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ return _py3dna.DefinitionReader_getMeshName(self, index) def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ return _py3dna.DefinitionReader_getMeshIndexListCount(self) def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) # Register DefinitionReader in _py3dna: _py3dna.DefinitionReader_swigregister(DefinitionReader) - class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -687,96 +1276,284 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawFromValues(self) def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getGUIToRawToValues(self) def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getGUIToRawCutValues(self) def getPSDCount(self): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorReader_getPSDCount(self) def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ return _py3dna.BehaviorReader_getPSDRowIndices(self) def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ return _py3dna.BehaviorReader_getPSDColumnIndices(self) def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ return _py3dna.BehaviorReader_getPSDValues(self) def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointRowCount(self) def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorReader_getJointColumnCount(self) def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" return _py3dna.BehaviorReader_getJointGroupCount(self) def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ return _py3dna.BehaviorReader_getAnimatedMapLODs(self) def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ return _py3dna.BehaviorReader_getAnimatedMapToValues(self) def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) # Register BehaviorReader in _py3dna: _py3dna.BehaviorReader_swigregister(BehaviorReader) - class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -784,108 +1561,559 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getFaceCount(self, meshIndex) def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) # Register GeometryReader in _py3dna: _py3dna.GeometryReader_swigregister(GeometryReader) - class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -894,11 +2122,16 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Reader def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ return _py3dna.Reader_unload(self, layer) # Register Reader in _py3dna: _py3dna.Reader_swigregister(Reader) - class StreamReader(Reader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -908,6 +2141,7 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamReader def read(self): + r""" read data from stream into internal structures.""" return _py3dna.StreamReader_read(self) # Register StreamReader in _py3dna: @@ -925,22 +2159,193 @@ def __init__(self, *args, **kwargs): @staticmethod def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamReader_create(*args) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ return _py3dna.BinaryStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamReader # Register BinaryStreamReader in _py3dna: _py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) - -def BinaryStreamReader_create(*args): - return _py3dna.BinaryStreamReader_create(*args) - -def BinaryStreamReader_destroy(instance): - return _py3dna.BinaryStreamReader_destroy(instance) - class JSONStreamReader(StreamReader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -950,37 +2355,128 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamReader_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ return _py3dna.JSONStreamReader_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamReader # Register JSONStreamReader in _py3dna: _py3dna.JSONStreamReader_swigregister(JSONStreamReader) -def JSONStreamReader_create(stream, memRes=None): - return _py3dna.JSONStreamReader_create(stream, memRes) +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader -def JSONStreamReader_destroy(instance): - return _py3dna.JSONStreamReader_destroy(instance) +class JSONStreamReaderImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) -BinaryStreamReader.__new__ = __new_decorator(BinaryStreamReader_create, BinaryStreamReader.__new__) -BinaryStreamReader.__del__ = lambda instance: BinaryStreamReader_destroy(instance) -BinaryStreamReader.__init__ = __managed_init -del BinaryStreamReader.create -del BinaryStreamReader.destroy + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') -JSONStreamReader.__new__ = __new_decorator(JSONStreamReader_create, JSONStreamReader.__new__) -JSONStreamReader.__del__ = lambda instance: JSONStreamReader_destroy(instance) -JSONStreamReader.__init__ = __managed_init -del JSONStreamReader.create -del JSONStreamReader.destroy + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -988,6 +2484,13 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ return _py3dna.DescriptorWriter_setName(self, name) def setArchetype(self, archetype): @@ -1000,9 +2503,23 @@ def setAge(self, age): return _py3dna.DescriptorWriter_setAge(self, age) def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" return _py3dna.DescriptorWriter_clearMetaData(self) def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ return _py3dna.DescriptorWriter_setMetaData(self, key, value) def setTranslationUnit(self, unit): @@ -1015,21 +2532,52 @@ def setCoordinateSystem(self, system): return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ return _py3dna.DescriptorWriter_setLODCount(self, lodCount) def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBComplexity(self, name) def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DescriptorWriter_setDBName(self, name) # Register DescriptorWriter in _py3dna: _py3dna.DescriptorWriter_swigregister(DescriptorWriter) - class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1037,108 +2585,391 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" return _py3dna.DefinitionWriter_clearGUIControlNames(self) def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) def clearRawControlNames(self): + r""" Delete all stored raw control names.""" return _py3dna.DefinitionWriter_clearRawControlNames(self) def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setRawControlName(self, index, name) def clearJointNames(self): + r""" Delete all stored joint names.""" return _py3dna.DefinitionWriter_clearJointNames(self) def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setJointName(self, index, name) def clearJointIndices(self): + r""" Delete all stored joint indices.""" return _py3dna.DefinitionWriter_clearJointIndices(self) def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODJointMappings(self) def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) def clearMeshNames(self): + r""" Delete all stored mesh names.""" return _py3dna.DefinitionWriter_clearMeshNames(self) def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ return _py3dna.DefinitionWriter_setMeshName(self, index, name) def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" return _py3dna.DefinitionWriter_clearMeshIndices(self) def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" return _py3dna.DefinitionWriter_clearLODMeshMappings(self) def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) # Register DefinitionWriter in _py3dna: _py3dna.DefinitionWriter_swigregister(DefinitionWriter) - class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1146,96 +2977,387 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" return _py3dna.BehaviorWriter_setPSDCount(self, count) def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ return _py3dna.BehaviorWriter_setPSDValues(self, weights) def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) def clearJointGroups(self): + r""" Delete all joint groups.""" return _py3dna.BehaviorWriter_clearJointGroups(self) def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) # Register BehaviorWriter in _py3dna: _py3dna.BehaviorWriter_swigregister(BehaviorWriter) - class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1243,57 +3365,291 @@ def __init__(self, *args, **kwargs): __repr__ = _swig_repr def clearMeshes(self): + r""" Delete all meshes.""" return _py3dna.GeometryWriter_clearMeshes(self) def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) # Register GeometryWriter in _py3dna: _py3dna.GeometryWriter_swigregister(GeometryWriter) - class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -1302,11 +3658,28 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_Writer def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ return _py3dna.Writer_setFrom(self, *args) # Register Writer in _py3dna: _py3dna.Writer_swigregister(Writer) - class StreamWriter(Writer): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1316,11 +3689,11 @@ def __init__(self, *args, **kwargs): __swig_destroy__ = _py3dna.delete_StreamWriter def write(self): + r""" Write data to stream from internal structures.""" return _py3dna.StreamWriter_write(self) # Register StreamWriter in _py3dna: _py3dna.StreamWriter_swigregister(StreamWriter) - class BinaryStreamWriter(StreamWriter): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1330,22 +3703,36 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.BinaryStreamWriter_create(stream, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ return _py3dna.BinaryStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_BinaryStreamWriter # Register BinaryStreamWriter in _py3dna: _py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) - -def BinaryStreamWriter_create(stream, memRes=None): - return _py3dna.BinaryStreamWriter_create(stream, memRes) - -def BinaryStreamWriter_destroy(instance): - return _py3dna.BinaryStreamWriter_destroy(instance) - class JSONStreamWriter(StreamWriter): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -1355,35 +3742,121 @@ def __init__(self, *args, **kwargs): @staticmethod def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) @staticmethod def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ return _py3dna.JSONStreamWriter_destroy(instance) __swig_destroy__ = _py3dna.delete_JSONStreamWriter # Register JSONStreamWriter in _py3dna: _py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) -def JSONStreamWriter_create(stream, indentWidth=4, memRes=None): - return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + -def JSONStreamWriter_destroy(instance): - return _py3dna.JSONStreamWriter_destroy(instance) +JSONStreamWriterImpl = JSONStreamWriter +class JSONStreamWriterImplReflectionMixin(type): -BinaryStreamWriter.__new__ = __new_decorator(BinaryStreamWriter_create, BinaryStreamWriter.__new__) -BinaryStreamWriter.__del__ = lambda instance: BinaryStreamWriter_destroy(instance) -BinaryStreamWriter.__init__ = __managed_init -del BinaryStreamWriter.create -del BinaryStreamWriter.destroy + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] -JSONStreamWriter.__new__ = __new_decorator(JSONStreamWriter_create, JSONStreamWriter.__new__) -JSONStreamWriter.__del__ = lambda instance: JSONStreamWriter_destroy(instance) -JSONStreamWriter.__init__ = __managed_init -del JSONStreamWriter.create -del JSONStreamWriter.destroy +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] diff --git a/lib/Maya2023/windows/dnacalib.dll b/lib/Maya2023/windows/dnacalib.dll index 6e3aff2d..ce8a9431 100644 Binary files a/lib/Maya2023/windows/dnacalib.dll and b/lib/Maya2023/windows/dnacalib.dll differ diff --git a/lib/Maya2023/windows/dnacalib.py b/lib/Maya2023/windows/dnacalib.py index 8e4eca33..49cf7ee9 100644 --- a/lib/Maya2023/windows/dnacalib.py +++ b/lib/Maya2023/windows/dnacalib.py @@ -1,13 +1,22 @@ -# This file was automatically generated by SWIG (http://www.swig.org). -# Version 4.0.1 +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 # -# Do not make changes to this file unless you know what you are doing--modify +# Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. -from sys import version_info as _swig_python_version_info -if _swig_python_version_info < (2, 7, 0): - raise RuntimeError("Python 2.7 or later required") +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _py3dnacalib @@ -29,10 +38,10 @@ def _swig_repr(self): def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): - if name == "thisown": - self.this.own(value) - elif name == "this": + if name == "this": set(self, name, value) + elif name == "thisown": + self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: @@ -62,20 +71,16 @@ class _SwigNonDynamicMeta(type): -def __new_decorator(factory_func, original_new): - @staticmethod - def __new(cls, *args, **kwargs): -# FIXME: while this workaround solves the immediate issue with the set of classes we currently have, -# it will fail for classes that use a factory function but need no parameters at all, in which case -# the factory function will never be invoked, only the original __new__ function. - if args or kwargs: - return factory_func(*args, **kwargs) - return original_new(cls) - return __new - -def __managed_init(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) import dna class VersionInfo(object): @@ -104,19 +109,6 @@ def __init__(self): # Register VersionInfo in _py3dnacalib: _py3dnacalib.VersionInfo_swigregister(VersionInfo) - -def VersionInfo_getMajorVersion(): - return _py3dnacalib.VersionInfo_getMajorVersion() - -def VersionInfo_getMinorVersion(): - return _py3dnacalib.VersionInfo_getMinorVersion() - -def VersionInfo_getPatchVersion(): - return _py3dnacalib.VersionInfo_getPatchVersion() - -def VersionInfo_getVersionString(): - return _py3dnacalib.VersionInfo_getVersionString() - class DNACalibDNAReader(dna.Reader): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") @@ -135,20 +127,50 @@ def destroy(instance): # Register DNACalibDNAReader in _py3dnacalib: _py3dnacalib.DNACalibDNAReader_swigregister(DNACalibDNAReader) -def DNACalibDNAReader_create(*args): - return _py3dnacalib.DNACalibDNAReader_create(*args) +DNACalibDNAReaderImpl = DNACalibDNAReader -def DNACalibDNAReader_destroy(instance): - return _py3dnacalib.DNACalibDNAReader_destroy(instance) +class DNACalibDNAReaderImplReflectionMixin(type): + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) -DNACalibDNAReader.__new__ = __new_decorator(DNACalibDNAReader_create, DNACalibDNAReader.__new__) -DNACalibDNAReader.__del__ = lambda instance: DNACalibDNAReader_destroy(instance) -DNACalibDNAReader.__init__ = __managed_init -del DNACalibDNAReader.create -del DNACalibDNAReader.destroy + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): @@ -161,12 +183,19 @@ def run(self, output): # Register Command in _py3dnacalib: _py3dnacalib.Command_swigregister(Command) - VectorOperation_Interpolate = _py3dnacalib.VectorOperation_Interpolate VectorOperation_Add = _py3dnacalib.VectorOperation_Add VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CommandSequence @@ -178,21 +207,39 @@ def run(self, output): return _py3dnacalib.CommandSequence_run(self, output) def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ return _py3dnacalib.CommandSequence_add(self, command) def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ return _py3dnacalib.CommandSequence_remove(self, command) def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ return _py3dnacalib.CommandSequence_contains(self, command) def size(self): + r""" Number of commands in command sequence.""" return _py3dnacalib.CommandSequence_size(self) # Register CommandSequence in _py3dnacalib: _py3dnacalib.CommandSequence_swigregister(CommandSequence) - def command_sequence_init(_init): def wrapper(self, *args, **kwargs): self._commands = [] @@ -216,6 +263,12 @@ def wrapper(self, command): CommandSequence.remove = command_sequence_remove(CommandSequence.remove) class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand @@ -224,6 +277,12 @@ def __init__(self, *args): _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) def run(self, output): @@ -231,8 +290,12 @@ def run(self, output): # Register CalculateMeshLowerLODsCommand in _py3dnacalib: _py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) - class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand @@ -245,8 +308,9 @@ def run(self, output): # Register ClearBlendShapesCommand in _py3dnacalib: _py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) - class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand @@ -255,6 +319,12 @@ def __init__(self, *args): _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) def run(self, output): @@ -262,8 +332,9 @@ def run(self, output): # Register PruneBlendShapeTargetsCommand in _py3dnacalib: _py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) - class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand @@ -272,9 +343,23 @@ def __init__(self, *args): _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) def run(self, output): @@ -282,8 +367,9 @@ def run(self, output): # Register RemoveAnimatedMapCommand in _py3dnacalib: _py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) - class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand @@ -292,9 +378,23 @@ def __init__(self, *args): _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) def run(self, output): @@ -302,8 +402,9 @@ def run(self, output): # Register RemoveBlendShapeCommand in _py3dnacalib: _py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) - class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand @@ -312,9 +413,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -322,8 +437,9 @@ def run(self, output): # Register RemoveJointAnimationCommand in _py3dnacalib: _py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) - class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand @@ -332,9 +448,23 @@ def __init__(self, *args): _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -342,8 +472,9 @@ def run(self, output): # Register RemoveJointCommand in _py3dnacalib: _py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) - class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand @@ -352,9 +483,22 @@ def __init__(self, *args): _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) def run(self, output): @@ -362,8 +506,9 @@ def run(self, output): # Register RemoveMeshCommand in _py3dnacalib: _py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) - class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand @@ -372,6 +517,31 @@ def __init__(self, *args): _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) def run(self, output): @@ -379,8 +549,9 @@ def run(self, output): # Register RenameAnimatedMapCommand in _py3dnacalib: _py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) - class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand @@ -389,6 +560,31 @@ def __init__(self, *args): _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) def run(self, output): @@ -396,8 +592,9 @@ def run(self, output): # Register RenameBlendShapeCommand in _py3dnacalib: _py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) - class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand @@ -406,6 +603,31 @@ def __init__(self, *args): _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ return _py3dnacalib.RenameJointCommand_setName(self, *args) def run(self, output): @@ -413,8 +635,9 @@ def run(self, output): # Register RenameJointCommand in _py3dnacalib: _py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) - class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand @@ -423,6 +646,31 @@ def __init__(self, *args): _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ return _py3dnacalib.RenameMeshCommand_setName(self, *args) def run(self, output): @@ -430,8 +678,15 @@ def run(self, output): # Register RenameMeshCommand in _py3dnacalib: _py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) - class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_RotateCommand @@ -440,9 +695,21 @@ def __init__(self, *args): _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ return _py3dnacalib.RotateCommand_setRotation(self, degrees) def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.RotateCommand_setOrigin(self, origin) def run(self, output): @@ -450,8 +717,13 @@ def run(self, output): # Register RotateCommand in _py3dnacalib: _py3dnacalib.RotateCommand_swigregister(RotateCommand) - class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_ScaleCommand @@ -460,9 +732,22 @@ def __init__(self, *args): _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ return _py3dnacalib.ScaleCommand_setScale(self, scale) def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ return _py3dnacalib.ScaleCommand_setOrigin(self, origin) def run(self, output): @@ -470,8 +755,9 @@ def run(self, output): # Register ScaleCommand in _py3dnacalib: _py3dnacalib.ScaleCommand_swigregister(ScaleCommand) - class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand @@ -480,21 +766,85 @@ def __init__(self, *args): _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) def run(self, output): @@ -509,6 +859,8 @@ def run(self, output): SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand @@ -517,6 +869,12 @@ def __init__(self, *args): _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ return _py3dnacalib.SetLODsCommand_setLODs(self, lods) def run(self, output): @@ -524,8 +882,9 @@ def run(self, output): # Register SetLODsCommand in _py3dnacalib: _py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) - class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand @@ -534,6 +893,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) def run(self, output): @@ -541,8 +923,9 @@ def run(self, output): # Register SetNeutralJointRotationsCommand in _py3dnacalib: _py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) - class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand @@ -551,6 +934,29 @@ def __init__(self, *args): _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) def run(self, output): @@ -558,8 +964,9 @@ def run(self, output): # Register SetNeutralJointTranslationsCommand in _py3dnacalib: _py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) - class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand @@ -568,15 +975,39 @@ def __init__(self, *args): _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) def run(self, output): @@ -584,8 +1015,9 @@ def run(self, output): # Register SetSkinWeightsCommand in _py3dnacalib: _py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) - class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand @@ -594,15 +1026,67 @@ def __init__(self, *args): _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) def run(self, output): @@ -613,6 +1097,12 @@ def run(self, output): SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr __swig_destroy__ = _py3dnacalib.delete_TranslateCommand @@ -621,6 +1111,12 @@ def __init__(self, *args): _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ return _py3dnacalib.TranslateCommand_setTranslation(self, translation) def run(self, output): @@ -629,5 +1125,3 @@ def run(self, output): # Register TranslateCommand in _py3dnacalib: _py3dnacalib.TranslateCommand_swigregister(TranslateCommand) - - diff --git a/lib/Maya2024/linux/MayaUERBFPlugin.mll b/lib/Maya2024/linux/MayaUERBFPlugin.mll new file mode 100644 index 00000000..d0c98165 Binary files /dev/null and b/lib/Maya2024/linux/MayaUERBFPlugin.mll differ diff --git a/lib/Maya2024/linux/_py3dna.so b/lib/Maya2024/linux/_py3dna.so new file mode 100644 index 00000000..2d781a2e Binary files /dev/null and b/lib/Maya2024/linux/_py3dna.so differ diff --git a/lib/Maya2024/linux/_py3dnacalib.so b/lib/Maya2024/linux/_py3dnacalib.so new file mode 100644 index 00000000..50ec984e Binary files /dev/null and b/lib/Maya2024/linux/_py3dnacalib.so differ diff --git a/lib/Maya2024/linux/dna.py b/lib/Maya2024/linux/dna.py new file mode 100644 index 00000000..ed8fbaa0 --- /dev/null +++ b/lib/Maya2024/linux/dna.py @@ -0,0 +1,4298 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 4.0.2 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info < (2, 7, 0): + raise RuntimeError("Python 2.7 or later required") + +# Import the low-level C/C++ module +if __package__ or "." in __name__: + from . import _py3dna +else: + import _py3dna + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_instance_variable(set): + def set_instance_attr(self, name, value): + if name == "thisown": + self.this.own(value) + elif name == "this": + set(self, name, value) + elif hasattr(self, name) and isinstance(getattr(type(self), name), property): + set(self, name, value) + else: + raise AttributeError("You cannot add instance attributes to %s" % self) + return set_instance_attr + + +def _swig_setattr_nondynamic_class_variable(set): + def set_class_attr(cls, name, value): + if hasattr(cls, name) and not isinstance(getattr(cls, name), property): + set(cls, name, value) + else: + raise AttributeError("You cannot add class attributes to %s" % cls) + return set_class_attr + + +def _swig_add_metaclass(metaclass): + """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass""" + def wrapper(cls): + return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy()) + return wrapper + + +class _SwigNonDynamicMeta(type): + """Meta class to enforce nondynamic attributes (no new attributes) for a class""" + __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) + + + +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + +class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_MemoryResource + + def allocate(self, size, alignment): + return _py3dna.MemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.MemoryResource_deallocate(self, ptr, size, alignment) + +# Register MemoryResource in _py3dna: +_py3dna.MemoryResource_swigregister(MemoryResource) + +class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def allocate(self, size, alignment): + return _py3dna.AlignedMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.AlignedMemoryResource_deallocate(self, ptr, size, alignment) + + def __init__(self): + _py3dna.AlignedMemoryResource_swiginit(self, _py3dna.new_AlignedMemoryResource()) + __swig_destroy__ = _py3dna.delete_AlignedMemoryResource + +# Register AlignedMemoryResource in _py3dna: +_py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) + +class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_ArenaMemoryResource + + def __init__(self, *args): + _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) + + def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" + return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" + return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) + + def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" + return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) + +# Register ArenaMemoryResource in _py3dna: +_py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) + +class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def allocate(self, size, alignment): + return _py3dna.DefaultMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.DefaultMemoryResource_deallocate(self, ptr, size, alignment) + + def __init__(self): + _py3dna.DefaultMemoryResource_swiginit(self, _py3dna.new_DefaultMemoryResource()) + __swig_destroy__ = _py3dna.delete_DefaultMemoryResource + +# Register DefaultMemoryResource in _py3dna: +_py3dna.DefaultMemoryResource_swigregister(DefaultMemoryResource) + +class StatusCode(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + code = property(_py3dna.StatusCode_code_get, _py3dna.StatusCode_code_set) + message = property(_py3dna.StatusCode_message_get, _py3dna.StatusCode_message_set) + + def __init__(self): + _py3dna.StatusCode_swiginit(self, _py3dna.new_StatusCode()) + __swig_destroy__ = _py3dna.delete_StatusCode + +# Register StatusCode in _py3dna: +_py3dna.StatusCode_swigregister(StatusCode) + +class Status(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + @staticmethod + def isOk(): + return _py3dna.Status_isOk() + + @staticmethod + def get(): + return _py3dna.Status_get() + + def __init__(self): + _py3dna.Status_swiginit(self, _py3dna.new_Status()) + __swig_destroy__ = _py3dna.delete_Status + +# Register Status in _py3dna: +_py3dna.Status_swigregister(Status) + +def Status_isOk(): + return _py3dna.Status_isOk() + +def Status_get(): + return _py3dna.Status_get() + +class Readable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ + return _py3dna.Readable_read(self, *args) + +# Register Readable in _py3dna: +_py3dna.Readable_swigregister(Readable) + +class Writable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ + return _py3dna.Writable_write(self, *args) + +# Register Writable in _py3dna: +_py3dna.Writable_swigregister(Writable) + +class Seekable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ + return _py3dna.Seekable_tell(self) + + def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ + return _py3dna.Seekable_seek(self, position) + +# Register Seekable in _py3dna: +_py3dna.Seekable_swigregister(Seekable) + +class Openable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def open(self): + r""" Open access to the stream.""" + return _py3dna.Openable_open(self) + +# Register Openable in _py3dna: +_py3dna.Openable_swigregister(Openable) + +class Closeable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def close(self): + r""" Close access to the stream.""" + return _py3dna.Closeable_close(self) + +# Register Closeable in _py3dna: +_py3dna.Closeable_swigregister(Closeable) + +class Controllable(Openable, Closeable): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + +# Register Controllable in _py3dna: +_py3dna.Controllable_swigregister(Controllable) + +class Bounded(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ + return _py3dna.Bounded_size(self) + +# Register Bounded in _py3dna: +_py3dna.Bounded_swigregister(Bounded) + +class Buffered(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def flush(self): + r""" Flush the changes to filesystem.""" + return _py3dna.Buffered_flush(self) + +# Register Buffered in _py3dna: +_py3dna.Buffered_swigregister(Buffered) + +class Resizable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def resize(self, size): + r""" Resize file to the requested size.""" + return _py3dna.Resizable_resize(self, size) + +# Register Resizable in _py3dna: +_py3dna.Resizable_swigregister(Resizable) + +class BoundedIOStream(Controllable, Readable, Writable, Seekable, Bounded): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_BoundedIOStream + +# Register BoundedIOStream in _py3dna: +_py3dna.BoundedIOStream_swigregister(BoundedIOStream) +cvar = _py3dna.cvar +BoundedIOStream.OpenError = _py3dna.cvar.BoundedIOStream_OpenError +BoundedIOStream.ReadError = _py3dna.cvar.BoundedIOStream_ReadError +BoundedIOStream.WriteError = _py3dna.cvar.BoundedIOStream_WriteError +BoundedIOStream.AlreadyOpenError = _py3dna.cvar.BoundedIOStream_AlreadyOpenError +BoundedIOStream.SeekError = _py3dna.cvar.BoundedIOStream_SeekError + +AccessMode_Read = _py3dna.AccessMode_Read +AccessMode_Write = _py3dna.AccessMode_Write +AccessMode_ReadWrite = _py3dna.AccessMode_ReadWrite +OpenMode_Binary = _py3dna.OpenMode_Binary +OpenMode_Text = _py3dna.OpenMode_Text +class FileStream(BoundedIOStream): + r""" Standard file stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.FileStream_create(path, accessMode, openMode, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ + return _py3dna.FileStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_FileStream + +# Register FileStream in _py3dna: +_py3dna.FileStream_swigregister(FileStream) + +def FileStream_create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.FileStream_create(path, accessMode, openMode, memRes) + +def FileStream_destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ + return _py3dna.FileStream_destroy(instance) + +class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ + return _py3dna.MemoryMappedFileStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream + +# Register MemoryMappedFileStream in _py3dna: +_py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) + +def MemoryMappedFileStream_create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) + +def MemoryMappedFileStream_destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ + return _py3dna.MemoryMappedFileStream_destroy(instance) + +class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryStream_create(*args) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ + return _py3dna.MemoryStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_MemoryStream + +# Register MemoryStream in _py3dna: +_py3dna.MemoryStream_swigregister(MemoryStream) + +def MemoryStream_create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryStream_create(*args) + +def MemoryStream_destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ + return _py3dna.MemoryStream_destroy(instance) + + +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] + +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryMappedFileStreamImpl = MemoryMappedFileStream + +class MemoryMappedFileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +FileStream.AccessMode_Read = AccessMode_Read +FileStream.AccessMode_Write = AccessMode_Write +FileStream.AccessMode_ReadWrite = AccessMode_ReadWrite + +FileStream.OpenMode_Binary = OpenMode_Binary +FileStream.OpenMode_Text = OpenMode_Text + +MemoryMappedFileStream.AccessMode_Read = AccessMode_Read +MemoryMappedFileStream.AccessMode_Write = AccessMode_Write +MemoryMappedFileStream.AccessMode_ReadWrite = AccessMode_ReadWrite + +class StringView(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def c_str(self): + return _py3dna.StringView_c_str(self) + + def __ref__(self): + return _py3dna.StringView___ref__(self) + + def __init__(self): + _py3dna.StringView_swiginit(self, _py3dna.new_StringView()) + __swig_destroy__ = _py3dna.delete_StringView + +# Register StringView in _py3dna: +_py3dna.StringView_swigregister(StringView) + + +def __add__(*args): + return _py3dna.__add__(*args) + +def __sub__(*args): + return _py3dna.__sub__(*args) + +def __mul__(*args): + return _py3dna.__mul__(*args) + +def __truediv__(*args): + return _py3dna.__truediv__(*args) + +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) + +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) +DataLayer_Descriptor = _py3dna.DataLayer_Descriptor +DataLayer_Definition = _py3dna.DataLayer_Definition +DataLayer_Behavior = _py3dna.DataLayer_Behavior +DataLayer_Geometry = _py3dna.DataLayer_Geometry +DataLayer_GeometryWithoutBlendShapes = _py3dna.DataLayer_GeometryWithoutBlendShapes +DataLayer_AllWithoutBlendShapes = _py3dna.DataLayer_AllWithoutBlendShapes +DataLayer_All = _py3dna.DataLayer_All +Archetype_asian = _py3dna.Archetype_asian +Archetype_black = _py3dna.Archetype_black +Archetype_caucasian = _py3dna.Archetype_caucasian +Archetype_hispanic = _py3dna.Archetype_hispanic +Archetype_alien = _py3dna.Archetype_alien +Archetype_other = _py3dna.Archetype_other +Gender_male = _py3dna.Gender_male +Gender_female = _py3dna.Gender_female +Gender_other = _py3dna.Gender_other +TranslationUnit_cm = _py3dna.TranslationUnit_cm +TranslationUnit_m = _py3dna.TranslationUnit_m +RotationUnit_degrees = _py3dna.RotationUnit_degrees +RotationUnit_radians = _py3dna.RotationUnit_radians +Direction_left = _py3dna.Direction_left +Direction_right = _py3dna.Direction_right +Direction_up = _py3dna.Direction_up +Direction_down = _py3dna.Direction_down +Direction_front = _py3dna.Direction_front +Direction_back = _py3dna.Direction_back +class CoordinateSystem(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + xAxis = property(_py3dna.CoordinateSystem_xAxis_get, _py3dna.CoordinateSystem_xAxis_set) + yAxis = property(_py3dna.CoordinateSystem_yAxis_get, _py3dna.CoordinateSystem_yAxis_set) + zAxis = property(_py3dna.CoordinateSystem_zAxis_get, _py3dna.CoordinateSystem_zAxis_set) + + def __init__(self): + _py3dna.CoordinateSystem_swiginit(self, _py3dna.new_CoordinateSystem()) + __swig_destroy__ = _py3dna.delete_CoordinateSystem + +# Register CoordinateSystem in _py3dna: +_py3dna.CoordinateSystem_swigregister(CoordinateSystem) + +class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getName(self): + return _py3dna.DescriptorReader_getName(self) + + def getArchetype(self): + return _py3dna.DescriptorReader_getArchetype(self) + + def getGender(self): + return _py3dna.DescriptorReader_getGender(self) + + def getAge(self): + return _py3dna.DescriptorReader_getAge(self) + + def getMetaDataCount(self): + return _py3dna.DescriptorReader_getMetaDataCount(self) + + def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ + return _py3dna.DescriptorReader_getMetaDataKey(self, index) + + def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ + return _py3dna.DescriptorReader_getMetaDataValue(self, key) + + def getTranslationUnit(self): + return _py3dna.DescriptorReader_getTranslationUnit(self) + + def getRotationUnit(self): + return _py3dna.DescriptorReader_getRotationUnit(self) + + def getCoordinateSystem(self): + return _py3dna.DescriptorReader_getCoordinateSystem(self) + + def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ + return _py3dna.DescriptorReader_getLODCount(self) + + def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ + return _py3dna.DescriptorReader_getDBMaxLOD(self) + + def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ + return _py3dna.DescriptorReader_getDBComplexity(self) + + def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ + return _py3dna.DescriptorReader_getDBName(self) + +# Register DescriptorReader in _py3dna: +_py3dna.DescriptorReader_swigregister(DescriptorReader) + +class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) + blendShapeChannelIndex = property(_py3dna.MeshBlendShapeChannelMapping_blendShapeChannelIndex_get, _py3dna.MeshBlendShapeChannelMapping_blendShapeChannelIndex_set) + + def __init__(self): + _py3dna.MeshBlendShapeChannelMapping_swiginit(self, _py3dna.new_MeshBlendShapeChannelMapping()) + __swig_destroy__ = _py3dna.delete_MeshBlendShapeChannelMapping + +# Register MeshBlendShapeChannelMapping in _py3dna: +_py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) + +class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getGUIControlCount(self): + return _py3dna.DefinitionReader_getGUIControlCount(self) + + def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ + return _py3dna.DefinitionReader_getGUIControlName(self, index) + + def getRawControlCount(self): + return _py3dna.DefinitionReader_getRawControlCount(self) + + def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ + return _py3dna.DefinitionReader_getRawControlName(self, index) + + def getJointCount(self): + return _py3dna.DefinitionReader_getJointCount(self) + + def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ + return _py3dna.DefinitionReader_getJointName(self, index) + + def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getJointIndexListCount(self) + + def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ + return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) + + def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ + return _py3dna.DefinitionReader_getJointParentIndex(self, index) + + def getBlendShapeChannelCount(self): + return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) + + def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ + return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) + + def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) + + def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ + return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) + + def getAnimatedMapCount(self): + return _py3dna.DefinitionReader_getAnimatedMapCount(self) + + def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ + return _py3dna.DefinitionReader_getAnimatedMapName(self, index) + + def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) + + def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ + return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) + + def getMeshCount(self): + return _py3dna.DefinitionReader_getMeshCount(self) + + def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ + return _py3dna.DefinitionReader_getMeshName(self, index) + + def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getMeshIndexListCount(self) + + def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ + return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) + + def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) + + def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) + + def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) + + def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ + return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) + + def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) + + def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) + + def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) + + def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ + return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) + + def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) + + def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) + + def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) + +# Register DefinitionReader in _py3dna: +_py3dna.DefinitionReader_swigregister(DefinitionReader) + +class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) + + def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) + + def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getGUIToRawFromValues(self) + + def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getGUIToRawToValues(self) + + def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) + + def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getGUIToRawCutValues(self) + + def getPSDCount(self): + r""" The number of distinct PSD expressions.""" + return _py3dna.BehaviorReader_getPSDCount(self) + + def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ + return _py3dna.BehaviorReader_getPSDRowIndices(self) + + def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ + return _py3dna.BehaviorReader_getPSDColumnIndices(self) + + def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ + return _py3dna.BehaviorReader_getPSDValues(self) + + def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorReader_getJointRowCount(self) + + def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorReader_getJointColumnCount(self) + + def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ + return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) + + def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" + return _py3dna.BehaviorReader_getJointGroupCount(self) + + def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) + + def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ + return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) + + def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ + return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) + + def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ + return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) + + def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ + return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) + + def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) + + def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) + + def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) + + def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getAnimatedMapLODs(self) + + def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) + + def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) + + def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) + + def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getAnimatedMapToValues(self) + + def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) + + def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) + +# Register BehaviorReader in _py3dna: +_py3dna.BehaviorReader_swigregister(BehaviorReader) + +class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) + + def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ + return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) + + def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) + + def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) + + def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) + + def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) + + def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ + return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) + + def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) + + def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) + + def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) + + def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ + return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) + + def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) + + def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) + + def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) + + def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) + + def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) + + def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) + + def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) + + def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) + + def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getFaceCount(self, meshIndex) + + def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) + + def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) + + def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) + + def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ + return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) + + def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ + return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) + + def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) + + def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ + return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) + + def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ + return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) + +# Register GeometryReader in _py3dna: +_py3dna.GeometryReader_swigregister(GeometryReader) + +class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_Reader + + def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ + return _py3dna.Reader_unload(self, layer) + +# Register Reader in _py3dna: +_py3dna.Reader_swigregister(Reader) + +class StreamReader(Reader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_StreamReader + + def read(self): + r""" read data from stream into internal structures.""" + return _py3dna.StreamReader_read(self) + +# Register StreamReader in _py3dna: +_py3dna.StreamReader_swigregister(StreamReader) +StreamReader.SignatureMismatchError = _py3dna.cvar.StreamReader_SignatureMismatchError +StreamReader.VersionMismatchError = _py3dna.cvar.StreamReader_VersionMismatchError +StreamReader.InvalidDataError = _py3dna.cvar.StreamReader_InvalidDataError + +class BinaryStreamReader(StreamReader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamReader_create(*args) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ + return _py3dna.BinaryStreamReader_destroy(instance) + __swig_destroy__ = _py3dna.delete_BinaryStreamReader + +# Register BinaryStreamReader in _py3dna: +_py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) + +def BinaryStreamReader_create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamReader_create(*args) + +def BinaryStreamReader_destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ + return _py3dna.BinaryStreamReader_destroy(instance) + +class JSONStreamReader(StreamReader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamReader_create(stream, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ + return _py3dna.JSONStreamReader_destroy(instance) + __swig_destroy__ = _py3dna.delete_JSONStreamReader + +# Register JSONStreamReader in _py3dna: +_py3dna.JSONStreamReader_swigregister(JSONStreamReader) + +def JSONStreamReader_create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamReader_create(stream, memRes) + +def JSONStreamReader_destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ + return _py3dna.JSONStreamReader_destroy(instance) + + +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader + +class JSONStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] + +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + +class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ + return _py3dna.DescriptorWriter_setName(self, name) + + def setArchetype(self, archetype): + return _py3dna.DescriptorWriter_setArchetype(self, archetype) + + def setGender(self, gender): + return _py3dna.DescriptorWriter_setGender(self, gender) + + def setAge(self, age): + return _py3dna.DescriptorWriter_setAge(self, age) + + def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" + return _py3dna.DescriptorWriter_clearMetaData(self) + + def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ + return _py3dna.DescriptorWriter_setMetaData(self, key, value) + + def setTranslationUnit(self, unit): + return _py3dna.DescriptorWriter_setTranslationUnit(self, unit) + + def setRotationUnit(self, unit): + return _py3dna.DescriptorWriter_setRotationUnit(self, unit) + + def setCoordinateSystem(self, system): + return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) + + def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ + return _py3dna.DescriptorWriter_setLODCount(self, lodCount) + + def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" + return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) + + def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DescriptorWriter_setDBComplexity(self, name) + + def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DescriptorWriter_setDBName(self, name) + +# Register DescriptorWriter in _py3dna: +_py3dna.DescriptorWriter_swigregister(DescriptorWriter) + +class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" + return _py3dna.DefinitionWriter_clearGUIControlNames(self) + + def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) + + def clearRawControlNames(self): + r""" Delete all stored raw control names.""" + return _py3dna.DefinitionWriter_clearRawControlNames(self) + + def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setRawControlName(self, index, name) + + def clearJointNames(self): + r""" Delete all stored joint names.""" + return _py3dna.DefinitionWriter_clearJointNames(self) + + def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setJointName(self, index, name) + + def clearJointIndices(self): + r""" Delete all stored joint indices.""" + return _py3dna.DefinitionWriter_clearJointIndices(self) + + def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) + + def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODJointMappings(self) + + def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ + return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) + + def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" + return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) + + def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) + + def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" + return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) + + def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ + return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) + + def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) + + def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ + return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) + + def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" + return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) + + def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) + + def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" + return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) + + def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ + return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) + + def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) + + def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ + return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) + + def clearMeshNames(self): + r""" Delete all stored mesh names.""" + return _py3dna.DefinitionWriter_clearMeshNames(self) + + def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setMeshName(self, index, name) + + def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" + return _py3dna.DefinitionWriter_clearMeshIndices(self) + + def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ + return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) + + def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODMeshMappings(self) + + def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ + return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) + + def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" + return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) + + def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ + return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) + + def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) + + def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ + return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) + + def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ + return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) + +# Register DefinitionWriter in _py3dna: +_py3dna.DefinitionWriter_swigregister(DefinitionWriter) + +class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) + + def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) + + def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) + + def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) + + def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) + + def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) + + def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" + return _py3dna.BehaviorWriter_setPSDCount(self, count) + + def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ + return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) + + def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ + return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) + + def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ + return _py3dna.BehaviorWriter_setPSDValues(self, weights) + + def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) + + def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) + + def clearJointGroups(self): + r""" Delete all joint groups.""" + return _py3dna.BehaviorWriter_clearJointGroups(self) + + def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ + return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) + + def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) + + def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) + + def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) + + def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) + + def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) + + def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) + + def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) + + def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) + + def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) + + def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) + + def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) + + def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) + + def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) + + def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) + + def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) + +# Register BehaviorWriter in _py3dna: +_py3dna.BehaviorWriter_swigregister(BehaviorWriter) + +class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def clearMeshes(self): + r""" Delete all meshes.""" + return _py3dna.GeometryWriter_clearMeshes(self) + + def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) + + def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) + + def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) + + def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) + + def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) + + def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) + + def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) + + def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ + return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) + + def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) + + def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ + return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) + + def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ + return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) + + def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) + + def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) + + def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) + + def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ + return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) + +# Register GeometryWriter in _py3dna: +_py3dna.GeometryWriter_swigregister(GeometryWriter) + +class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_Writer + + def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ + return _py3dna.Writer_setFrom(self, *args) + +# Register Writer in _py3dna: +_py3dna.Writer_swigregister(Writer) + +class StreamWriter(Writer): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_StreamWriter + + def write(self): + r""" Write data to stream from internal structures.""" + return _py3dna.StreamWriter_write(self) + +# Register StreamWriter in _py3dna: +_py3dna.StreamWriter_swigregister(StreamWriter) + +class BinaryStreamWriter(StreamWriter): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamWriter_create(stream, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ + return _py3dna.BinaryStreamWriter_destroy(instance) + __swig_destroy__ = _py3dna.delete_BinaryStreamWriter + +# Register BinaryStreamWriter in _py3dna: +_py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) + +def BinaryStreamWriter_create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamWriter_create(stream, memRes) + +def BinaryStreamWriter_destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ + return _py3dna.BinaryStreamWriter_destroy(instance) + +class JSONStreamWriter(StreamWriter): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ + return _py3dna.JSONStreamWriter_destroy(instance) + __swig_destroy__ = _py3dna.delete_JSONStreamWriter + +# Register JSONStreamWriter in _py3dna: +_py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) + +def JSONStreamWriter_create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) + +def JSONStreamWriter_destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ + return _py3dna.JSONStreamWriter_destroy(instance) + + +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamWriterImpl = JSONStreamWriter + +class JSONStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] + +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + + diff --git a/lib/Maya2024/linux/dnacalib.py b/lib/Maya2024/linux/dnacalib.py new file mode 100644 index 00000000..ae9d31bc --- /dev/null +++ b/lib/Maya2024/linux/dnacalib.py @@ -0,0 +1,1172 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 4.0.2 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info < (2, 7, 0): + raise RuntimeError("Python 2.7 or later required") + +# Import the low-level C/C++ module +if __package__ or "." in __name__: + from . import _py3dnacalib +else: + import _py3dnacalib + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_instance_variable(set): + def set_instance_attr(self, name, value): + if name == "thisown": + self.this.own(value) + elif name == "this": + set(self, name, value) + elif hasattr(self, name) and isinstance(getattr(type(self), name), property): + set(self, name, value) + else: + raise AttributeError("You cannot add instance attributes to %s" % self) + return set_instance_attr + + +def _swig_setattr_nondynamic_class_variable(set): + def set_class_attr(cls, name, value): + if hasattr(cls, name) and not isinstance(getattr(cls, name), property): + set(cls, name, value) + else: + raise AttributeError("You cannot add class attributes to %s" % cls) + return set_class_attr + + +def _swig_add_metaclass(metaclass): + """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass""" + def wrapper(cls): + return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy()) + return wrapper + + +class _SwigNonDynamicMeta(type): + """Meta class to enforce nondynamic attributes (no new attributes) for a class""" + __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) + + + +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + +import dna +class VersionInfo(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + @staticmethod + def getMajorVersion(): + return _py3dnacalib.VersionInfo_getMajorVersion() + + @staticmethod + def getMinorVersion(): + return _py3dnacalib.VersionInfo_getMinorVersion() + + @staticmethod + def getPatchVersion(): + return _py3dnacalib.VersionInfo_getPatchVersion() + + @staticmethod + def getVersionString(): + return _py3dnacalib.VersionInfo_getVersionString() + + def __init__(self): + _py3dnacalib.VersionInfo_swiginit(self, _py3dnacalib.new_VersionInfo()) + __swig_destroy__ = _py3dnacalib.delete_VersionInfo + +# Register VersionInfo in _py3dnacalib: +_py3dnacalib.VersionInfo_swigregister(VersionInfo) + +def VersionInfo_getMajorVersion(): + return _py3dnacalib.VersionInfo_getMajorVersion() + +def VersionInfo_getMinorVersion(): + return _py3dnacalib.VersionInfo_getMinorVersion() + +def VersionInfo_getPatchVersion(): + return _py3dnacalib.VersionInfo_getPatchVersion() + +def VersionInfo_getVersionString(): + return _py3dnacalib.VersionInfo_getVersionString() + +class DNACalibDNAReader(dna.Reader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + return _py3dnacalib.DNACalibDNAReader_create(*args) + + @staticmethod + def destroy(instance): + return _py3dnacalib.DNACalibDNAReader_destroy(instance) + +# Register DNACalibDNAReader in _py3dnacalib: +_py3dnacalib.DNACalibDNAReader_swigregister(DNACalibDNAReader) + +def DNACalibDNAReader_create(*args): + return _py3dnacalib.DNACalibDNAReader_create(*args) + +def DNACalibDNAReader_destroy(instance): + return _py3dnacalib.DNACalibDNAReader_destroy(instance) + + +DNACalibDNAReaderImpl = DNACalibDNAReader + +class DNACalibDNAReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + +class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_Command + + def run(self, output): + return _py3dnacalib.Command_run(self, output) + +# Register Command in _py3dnacalib: +_py3dnacalib.Command_swigregister(Command) + +VectorOperation_Interpolate = _py3dnacalib.VectorOperation_Interpolate +VectorOperation_Add = _py3dnacalib.VectorOperation_Add +VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract +VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply +class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_CommandSequence + + def __init__(self, *args): + _py3dnacalib.CommandSequence_swiginit(self, _py3dnacalib.new_CommandSequence(*args)) + + def run(self, output): + return _py3dnacalib.CommandSequence_run(self, output) + + def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ + return _py3dnacalib.CommandSequence_add(self, command) + + def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ + return _py3dnacalib.CommandSequence_remove(self, command) + + def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ + return _py3dnacalib.CommandSequence_contains(self, command) + + def size(self): + r""" Number of commands in command sequence.""" + return _py3dnacalib.CommandSequence_size(self) + +# Register CommandSequence in _py3dnacalib: +_py3dnacalib.CommandSequence_swigregister(CommandSequence) + + +def command_sequence_init(_init): + def wrapper(self, *args, **kwargs): + self._commands = [] + _init(self, *args, **kwargs) + return wrapper + +def command_sequence_add(_add): + def wrapper(self, command): + self._commands.append(command) + _add(self, command) + return wrapper + +def command_sequence_remove(_remove): + def wrapper(self, command): + self._commands.remove(command) + _remove(self, command) + return wrapper + +CommandSequence.__init__ = command_sequence_init(CommandSequence.__init__) +CommandSequence.add = command_sequence_add(CommandSequence.add) +CommandSequence.remove = command_sequence_remove(CommandSequence.remove) + +class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand + + def __init__(self, *args): + _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ + return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) + + def run(self, output): + return _py3dnacalib.CalculateMeshLowerLODsCommand_run(self, output) + +# Register CalculateMeshLowerLODsCommand in _py3dnacalib: +_py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) + +class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand + + def __init__(self, *args): + _py3dnacalib.ClearBlendShapesCommand_swiginit(self, _py3dnacalib.new_ClearBlendShapesCommand(*args)) + + def run(self, output): + return _py3dnacalib.ClearBlendShapesCommand_run(self, output) + +# Register ClearBlendShapesCommand in _py3dnacalib: +_py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) + +class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand + + def __init__(self, *args): + _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) + + def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ + return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) + + def run(self, output): + return _py3dnacalib.PruneBlendShapeTargetsCommand_run(self, output) + +# Register PruneBlendShapeTargetsCommand in _py3dnacalib: +_py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) + +class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand + + def __init__(self, *args): + _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) + + def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ + return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) + + def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ + return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) + + def run(self, output): + return _py3dnacalib.RemoveAnimatedMapCommand_run(self, output) + +# Register RemoveAnimatedMapCommand in _py3dnacalib: +_py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) + +class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand + + def __init__(self, *args): + _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) + + def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ + return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) + + def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ + return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) + + def run(self, output): + return _py3dnacalib.RemoveBlendShapeCommand_run(self, output) + +# Register RemoveBlendShapeCommand in _py3dnacalib: +_py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) + +class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand + + def __init__(self, *args): + _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) + + def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ + return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ + return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.RemoveJointAnimationCommand_run(self, output) + +# Register RemoveJointAnimationCommand in _py3dnacalib: +_py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) + +class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand + + def __init__(self, *args): + _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) + + def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ + return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ + return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.RemoveJointCommand_run(self, output) + +# Register RemoveJointCommand in _py3dnacalib: +_py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) + +class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand + + def __init__(self, *args): + _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ + return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) + + def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ + return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) + + def run(self, output): + return _py3dnacalib.RemoveMeshCommand_run(self, output) + +# Register RemoveMeshCommand in _py3dnacalib: +_py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) + +class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand + + def __init__(self, *args): + _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ + return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameAnimatedMapCommand_run(self, output) + +# Register RenameAnimatedMapCommand in _py3dnacalib: +_py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) + +class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand + + def __init__(self, *args): + _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ + return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameBlendShapeCommand_run(self, output) + +# Register RenameBlendShapeCommand in _py3dnacalib: +_py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) + +class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand + + def __init__(self, *args): + _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ + return _py3dnacalib.RenameJointCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameJointCommand_run(self, output) + +# Register RenameJointCommand in _py3dnacalib: +_py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) + +class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand + + def __init__(self, *args): + _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ + return _py3dnacalib.RenameMeshCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameMeshCommand_run(self, output) + +# Register RenameMeshCommand in _py3dnacalib: +_py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) + +class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RotateCommand + + def __init__(self, *args): + _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) + + def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ + return _py3dnacalib.RotateCommand_setRotation(self, degrees) + + def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ + return _py3dnacalib.RotateCommand_setOrigin(self, origin) + + def run(self, output): + return _py3dnacalib.RotateCommand_run(self, output) + +# Register RotateCommand in _py3dnacalib: +_py3dnacalib.RotateCommand_swigregister(RotateCommand) + +class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_ScaleCommand + + def __init__(self, *args): + _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) + + def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ + return _py3dnacalib.ScaleCommand_setScale(self, scale) + + def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ + return _py3dnacalib.ScaleCommand_setOrigin(self, origin) + + def run(self, output): + return _py3dnacalib.ScaleCommand_run(self, output) + +# Register ScaleCommand in _py3dnacalib: +_py3dnacalib.ScaleCommand_swigregister(ScaleCommand) + +class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand + + def __init__(self, *args): + _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) + + def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) + + def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) + + def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) + + def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) + + def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) + + def run(self, output): + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_run(self, output) + +# Register SetBlendShapeTargetDeltasCommand in _py3dnacalib: +_py3dnacalib.SetBlendShapeTargetDeltasCommand_swigregister(SetBlendShapeTargetDeltasCommand) +cvar = _py3dnacalib.cvar +SetBlendShapeTargetDeltasCommand.VertexIndicesOutOfBoundsError = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_VertexIndicesOutOfBoundsError +SetBlendShapeTargetDeltasCommand.NoVertexIndicesSetError = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_NoVertexIndicesSetError +SetBlendShapeTargetDeltasCommand.DeltasVertexIndicesCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasVertexIndicesCountMismatch +SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch + +class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand + + def __init__(self, *args): + _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) + + def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ + return _py3dnacalib.SetLODsCommand_setLODs(self, lods) + + def run(self, output): + return _py3dnacalib.SetLODsCommand_run(self, output) + +# Register SetLODsCommand in _py3dnacalib: +_py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) + +class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand + + def __init__(self, *args): + _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) + + def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ + return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) + + def run(self, output): + return _py3dnacalib.SetNeutralJointRotationsCommand_run(self, output) + +# Register SetNeutralJointRotationsCommand in _py3dnacalib: +_py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) + +class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand + + def __init__(self, *args): + _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) + + def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ + return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) + + def run(self, output): + return _py3dnacalib.SetNeutralJointTranslationsCommand_run(self, output) + +# Register SetNeutralJointTranslationsCommand in _py3dnacalib: +_py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) + +class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand + + def __init__(self, *args): + _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) + + def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ + return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) + + def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ + return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ + return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.SetSkinWeightsCommand_run(self, output) + +# Register SetSkinWeightsCommand in _py3dnacalib: +_py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) + +class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand + + def __init__(self, *args): + _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) + + def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ + return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) + + def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ + return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) + + def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ + return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) + + def run(self, output): + return _py3dnacalib.SetVertexPositionsCommand_run(self, output) + +# Register SetVertexPositionsCommand in _py3dnacalib: +_py3dnacalib.SetVertexPositionsCommand_swigregister(SetVertexPositionsCommand) +SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch + +class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_TranslateCommand + + def __init__(self, *args): + _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) + + def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ + return _py3dnacalib.TranslateCommand_setTranslation(self, translation) + + def run(self, output): + return _py3dnacalib.TranslateCommand_run(self, output) + +# Register TranslateCommand in _py3dnacalib: +_py3dnacalib.TranslateCommand_swigregister(TranslateCommand) + + + diff --git a/lib/Maya2024/linux/libdnacalib.so.6 b/lib/Maya2024/linux/libdnacalib.so.6 new file mode 100644 index 00000000..4c8d8779 Binary files /dev/null and b/lib/Maya2024/linux/libdnacalib.so.6 differ diff --git a/lib/Maya2024/linux/libembeddedRL4.so b/lib/Maya2024/linux/libembeddedRL4.so new file mode 100644 index 00000000..dd374546 Binary files /dev/null and b/lib/Maya2024/linux/libembeddedRL4.so differ diff --git a/lib/Maya2024/windows/MayaUERBFPlugin.mll b/lib/Maya2024/windows/MayaUERBFPlugin.mll new file mode 100644 index 00000000..d8e253dc Binary files /dev/null and b/lib/Maya2024/windows/MayaUERBFPlugin.mll differ diff --git a/lib/Maya2024/windows/_py3dna.pyd b/lib/Maya2024/windows/_py3dna.pyd new file mode 100644 index 00000000..e0907ea9 Binary files /dev/null and b/lib/Maya2024/windows/_py3dna.pyd differ diff --git a/lib/Maya2024/windows/_py3dnacalib.pyd b/lib/Maya2024/windows/_py3dnacalib.pyd new file mode 100644 index 00000000..930f3969 Binary files /dev/null and b/lib/Maya2024/windows/_py3dnacalib.pyd differ diff --git a/lib/Maya2024/windows/dna.py b/lib/Maya2024/windows/dna.py new file mode 100644 index 00000000..a25f8271 --- /dev/null +++ b/lib/Maya2024/windows/dna.py @@ -0,0 +1,3862 @@ +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 +# +# Do not make changes to this file unless you know what you are doing - modify +# the SWIG interface file instead. + + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info +# Import the low-level C/C++ module +if __package__ or "." in __name__: + from . import _py3dna +else: + import _py3dna + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_instance_variable(set): + def set_instance_attr(self, name, value): + if name == "this": + set(self, name, value) + elif name == "thisown": + self.this.own(value) + elif hasattr(self, name) and isinstance(getattr(type(self), name), property): + set(self, name, value) + else: + raise AttributeError("You cannot add instance attributes to %s" % self) + return set_instance_attr + + +def _swig_setattr_nondynamic_class_variable(set): + def set_class_attr(cls, name, value): + if hasattr(cls, name) and not isinstance(getattr(cls, name), property): + set(cls, name, value) + else: + raise AttributeError("You cannot add class attributes to %s" % cls) + return set_class_attr + + +def _swig_add_metaclass(metaclass): + """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass""" + def wrapper(cls): + return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy()) + return wrapper + + +class _SwigNonDynamicMeta(type): + """Meta class to enforce nondynamic attributes (no new attributes) for a class""" + __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) + + + +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + +class MemoryResource(object): + r""" + MemoryResource is an abstract class that allows the implementation of polymorphic allocators. + Notes: + It's purpose is to allow passing arbitrary allocators through API boundaries, without requiring changes in the + signatures and types involved. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_MemoryResource + + def allocate(self, size, alignment): + return _py3dna.MemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.MemoryResource_deallocate(self, ptr, size, alignment) + +# Register MemoryResource in _py3dna: +_py3dna.MemoryResource_swigregister(MemoryResource) +class AlignedMemoryResource(MemoryResource): + r""" + A MemoryResource that honors alignment requirements. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def allocate(self, size, alignment): + return _py3dna.AlignedMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.AlignedMemoryResource_deallocate(self, ptr, size, alignment) + + def __init__(self): + _py3dna.AlignedMemoryResource_swiginit(self, _py3dna.new_AlignedMemoryResource()) + __swig_destroy__ = _py3dna.delete_AlignedMemoryResource + +# Register AlignedMemoryResource in _py3dna: +_py3dna.AlignedMemoryResource_swigregister(AlignedMemoryResource) +class ArenaMemoryResource(MemoryResource): + r""" + Serves allocations from a preallocated memory region. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_ArenaMemoryResource + + def __init__(self, *args): + _py3dna.ArenaMemoryResource_swiginit(self, _py3dna.new_ArenaMemoryResource(*args)) + + def allocate(self, size, alignment): + r""" All allocations will be served from the currently active memory region.""" + return _py3dna.ArenaMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + r""" This is a no-op, and the regions are only freed when the arena itself is destroyed.""" + return _py3dna.ArenaMemoryResource_deallocate(self, ptr, size, alignment) + + def getUpstreamMemoryResource(self): + r""" The upstream memory resource was passed through the constructor and is backing all arena allocations.""" + return _py3dna.ArenaMemoryResource_getUpstreamMemoryResource(self) + +# Register ArenaMemoryResource in _py3dna: +_py3dna.ArenaMemoryResource_swigregister(ArenaMemoryResource) +class DefaultMemoryResource(MemoryResource): + r""" + A MemoryResource that delegates to malloc / free. + See also: MemoryResource + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def allocate(self, size, alignment): + return _py3dna.DefaultMemoryResource_allocate(self, size, alignment) + + def deallocate(self, ptr, size, alignment): + return _py3dna.DefaultMemoryResource_deallocate(self, ptr, size, alignment) + + def __init__(self): + _py3dna.DefaultMemoryResource_swiginit(self, _py3dna.new_DefaultMemoryResource()) + __swig_destroy__ = _py3dna.delete_DefaultMemoryResource + +# Register DefaultMemoryResource in _py3dna: +_py3dna.DefaultMemoryResource_swigregister(DefaultMemoryResource) +class StatusCode(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + code = property(_py3dna.StatusCode_code_get, _py3dna.StatusCode_code_set) + message = property(_py3dna.StatusCode_message_get, _py3dna.StatusCode_message_set) + + def __init__(self): + _py3dna.StatusCode_swiginit(self, _py3dna.new_StatusCode()) + __swig_destroy__ = _py3dna.delete_StatusCode + +# Register StatusCode in _py3dna: +_py3dna.StatusCode_swigregister(StatusCode) +class Status(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + @staticmethod + def isOk(): + return _py3dna.Status_isOk() + + @staticmethod + def get(): + return _py3dna.Status_get() + + def __init__(self): + _py3dna.Status_swiginit(self, _py3dna.new_Status()) + __swig_destroy__ = _py3dna.delete_Status + +# Register Status in _py3dna: +_py3dna.Status_swigregister(Status) +class Readable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def read(self, *args): + r""" + *Overload 1:* + + Read bytes from stream into the given buffer. + :type destination: string + :param destination: + Destination buffer into which the data is going to be read from the stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + + | + + *Overload 2:* + + Read bytes from this stream into the given stream. + :type destination: :py:class:`Writable` + :param destination: + Destination stream into which the data is going to be read from this stream. + :type size: std::size_t + :param size: + Number of bytes to read from stream. + :rtype: std::size_t + :return: + Number of bytes read. + """ + return _py3dna.Readable_read(self, *args) + +# Register Readable in _py3dna: +_py3dna.Readable_swigregister(Readable) +class Writable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def write(self, *args): + r""" + *Overload 1:* + + Writes bytes from the given buffer to the stream. + :type source: string + :param source: + Source buffer from which the data is going to be written to the stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + + | + + *Overload 2:* + + Writes bytes from the given stream to this stream. + :type source: :py:class:`Readable` + :param source: + Source stream from which the data is going to be written into this stream. + :type size: std::size_t + :param size: + Number of bytes to write to the stream. + :rtype: std::size_t + :return: + Number of bytes written. + """ + return _py3dna.Writable_write(self, *args) + +# Register Writable in _py3dna: +_py3dna.Writable_swigregister(Writable) +class Seekable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def tell(self): + r""" + Get the current position in the stream. + :rtype: int + :return: + Position in the stream relative to it's start, with 0 denoting the start position. + """ + return _py3dna.Seekable_tell(self) + + def seek(self, position): + r""" + Set the current position in the stream. + :type position: int + :param position: + Position in the stream relative to it's start, with 0 denoting the start position. + """ + return _py3dna.Seekable_seek(self, position) + +# Register Seekable in _py3dna: +_py3dna.Seekable_swigregister(Seekable) +class Openable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def open(self): + r""" Open access to the stream.""" + return _py3dna.Openable_open(self) + +# Register Openable in _py3dna: +_py3dna.Openable_swigregister(Openable) +class Closeable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def close(self): + r""" Close access to the stream.""" + return _py3dna.Closeable_close(self) + +# Register Closeable in _py3dna: +_py3dna.Closeable_swigregister(Closeable) +class Controllable(Openable, Closeable): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + +# Register Controllable in _py3dna: +_py3dna.Controllable_swigregister(Controllable) +class Bounded(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def size(self): + r""" + Obtain size of stream in bytes. + :rtype: int + :return: + Size in bytes. + """ + return _py3dna.Bounded_size(self) + +# Register Bounded in _py3dna: +_py3dna.Bounded_swigregister(Bounded) +class Buffered(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def flush(self): + r""" Flush the changes to filesystem.""" + return _py3dna.Buffered_flush(self) + +# Register Buffered in _py3dna: +_py3dna.Buffered_swigregister(Buffered) +class Resizable(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def resize(self, size): + r""" Resize file to the requested size.""" + return _py3dna.Resizable_resize(self, size) + +# Register Resizable in _py3dna: +_py3dna.Resizable_swigregister(Resizable) +class BoundedIOStream(Controllable, Readable, Writable, Seekable, Bounded): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_BoundedIOStream + +# Register BoundedIOStream in _py3dna: +_py3dna.BoundedIOStream_swigregister(BoundedIOStream) +cvar = _py3dna.cvar +BoundedIOStream.OpenError = _py3dna.cvar.BoundedIOStream_OpenError +BoundedIOStream.ReadError = _py3dna.cvar.BoundedIOStream_ReadError +BoundedIOStream.WriteError = _py3dna.cvar.BoundedIOStream_WriteError +BoundedIOStream.AlreadyOpenError = _py3dna.cvar.BoundedIOStream_AlreadyOpenError +BoundedIOStream.SeekError = _py3dna.cvar.BoundedIOStream_SeekError + +AccessMode_Read = _py3dna.AccessMode_Read +AccessMode_Write = _py3dna.AccessMode_Write +AccessMode_ReadWrite = _py3dna.AccessMode_ReadWrite +OpenMode_Binary = _py3dna.OpenMode_Binary +OpenMode_Text = _py3dna.OpenMode_Text +class FileStream(BoundedIOStream): + r""" Standard file stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(path, accessMode, openMode, memRes=None): + r""" + Factory method for creation of a FileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type openMode: int + :param openMode: + Control whether the file is opened in binary or textual mode. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the FileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.FileStream_create(path, accessMode, openMode, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a FileStream instance. + :type instance: :py:class:`FileStream` + :param instance: + Instance of FileStream to be freed. + See also: create + """ + return _py3dna.FileStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_FileStream + +# Register FileStream in _py3dna: +_py3dna.FileStream_swigregister(FileStream) +class MemoryMappedFileStream(BoundedIOStream, Buffered, Resizable): + r""" Memory mapped file stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(path, accessMode, memRes=None): + r""" + Factory method for creation of a MemoryMappedFileStream instance. + :type path: string + :param path: + UTF-8 encoded path to file to be opened. + :type accessMode: int + :param accessMode: + Control whether the file is opened for reading or writing. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryMappedFileStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryMappedFileStream_create(path, accessMode, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a MemoryMappedFileStream instance. + :type instance: :py:class:`MemoryMappedFileStream` + :param instance: + Instance of MemoryMappedFileStream to be freed. + See also: create + """ + return _py3dna.MemoryMappedFileStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_MemoryMappedFileStream + +# Register MemoryMappedFileStream in _py3dna: +_py3dna.MemoryMappedFileStream_swigregister(MemoryMappedFileStream) +class MemoryStream(BoundedIOStream): + r""" In-memory stream.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + r""" + *Overload 1:* + + Factory method for creation of a MemoryStream instance. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of a MemoryStream instance. + :type initialSize: std::size_t + :param initialSize: + Initial size of the memory stream. + :param memRes: + The memory resource to be used for the allocation of the MemoryStream instance. + Notes: + If a custom memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.MemoryStream_create(*args) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a MemoryStream instance. + :type instance: :py:class:`MemoryStream` + :param instance: + Instance of MemoryStream to be freed. + See also: create + """ + return _py3dna.MemoryStream_destroy(instance) + __swig_destroy__ = _py3dna.delete_MemoryStream + +# Register MemoryStream in _py3dna: +_py3dna.MemoryStream_swigregister(MemoryStream) + +FileStreamImpl = FileStream + +class FileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(FileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(FileStreamImpl) if name not in ("create","destroy")] + +class FileStream(with_metaclass(FileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = FileStreamImpl.create(*args, **kwargs) + + def __del__(self): + FileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryMappedFileStreamImpl = MemoryMappedFileStream + +class MemoryMappedFileStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryMappedFileStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryMappedFileStreamImpl) if name not in ("create","destroy")] + +class MemoryMappedFileStream(with_metaclass(MemoryMappedFileStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryMappedFileStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryMappedFileStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +MemoryStreamImpl = MemoryStream + +class MemoryStreamImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(MemoryStreamImpl, name) + + def __dir__(cls): + return [name for name in dir(MemoryStreamImpl) if name not in ("create","destroy")] + +class MemoryStream(with_metaclass(MemoryStreamImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = MemoryStreamImpl.create(*args, **kwargs) + + def __del__(self): + MemoryStreamImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +FileStream.AccessMode_Read = AccessMode_Read +FileStream.AccessMode_Write = AccessMode_Write +FileStream.AccessMode_ReadWrite = AccessMode_ReadWrite + +FileStream.OpenMode_Binary = OpenMode_Binary +FileStream.OpenMode_Text = OpenMode_Text + +MemoryMappedFileStream.AccessMode_Read = AccessMode_Read +MemoryMappedFileStream.AccessMode_Write = AccessMode_Write +MemoryMappedFileStream.AccessMode_ReadWrite = AccessMode_ReadWrite + +class StringView(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + def c_str(self): + return _py3dna.StringView_c_str(self) + + def __ref__(self): + return _py3dna.StringView___ref__(self) + + def __init__(self): + _py3dna.StringView_swiginit(self, _py3dna.new_StringView()) + __swig_destroy__ = _py3dna.delete_StringView + +# Register StringView in _py3dna: +_py3dna.StringView_swigregister(StringView) + +def __add__(*args): + return _py3dna.__add__(*args) + +def __sub__(*args): + return _py3dna.__sub__(*args) + +def __mul__(*args): + return _py3dna.__mul__(*args) + +def __truediv__(*args): + return _py3dna.__truediv__(*args) + +def __eq__(lhs, rhs): + return _py3dna.__eq__(lhs, rhs) + +def __ne__(lhs, rhs): + return _py3dna.__ne__(lhs, rhs) +DataLayer_Descriptor = _py3dna.DataLayer_Descriptor +DataLayer_Definition = _py3dna.DataLayer_Definition +DataLayer_Behavior = _py3dna.DataLayer_Behavior +DataLayer_Geometry = _py3dna.DataLayer_Geometry +DataLayer_GeometryWithoutBlendShapes = _py3dna.DataLayer_GeometryWithoutBlendShapes +DataLayer_AllWithoutBlendShapes = _py3dna.DataLayer_AllWithoutBlendShapes +DataLayer_All = _py3dna.DataLayer_All +Archetype_asian = _py3dna.Archetype_asian +Archetype_black = _py3dna.Archetype_black +Archetype_caucasian = _py3dna.Archetype_caucasian +Archetype_hispanic = _py3dna.Archetype_hispanic +Archetype_alien = _py3dna.Archetype_alien +Archetype_other = _py3dna.Archetype_other +Gender_male = _py3dna.Gender_male +Gender_female = _py3dna.Gender_female +Gender_other = _py3dna.Gender_other +TranslationUnit_cm = _py3dna.TranslationUnit_cm +TranslationUnit_m = _py3dna.TranslationUnit_m +RotationUnit_degrees = _py3dna.RotationUnit_degrees +RotationUnit_radians = _py3dna.RotationUnit_radians +Direction_left = _py3dna.Direction_left +Direction_right = _py3dna.Direction_right +Direction_up = _py3dna.Direction_up +Direction_down = _py3dna.Direction_down +Direction_front = _py3dna.Direction_front +Direction_back = _py3dna.Direction_back +class CoordinateSystem(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + xAxis = property(_py3dna.CoordinateSystem_xAxis_get, _py3dna.CoordinateSystem_xAxis_set) + yAxis = property(_py3dna.CoordinateSystem_yAxis_get, _py3dna.CoordinateSystem_yAxis_set) + zAxis = property(_py3dna.CoordinateSystem_zAxis_get, _py3dna.CoordinateSystem_zAxis_set) + + def __init__(self): + _py3dna.CoordinateSystem_swiginit(self, _py3dna.new_CoordinateSystem()) + __swig_destroy__ = _py3dna.delete_CoordinateSystem + +# Register CoordinateSystem in _py3dna: +_py3dna.CoordinateSystem_swigregister(CoordinateSystem) +class DescriptorReader(object): + r""" + Read-only accessors for various metadata about the character and the rig. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getName(self): + return _py3dna.DescriptorReader_getName(self) + + def getArchetype(self): + return _py3dna.DescriptorReader_getArchetype(self) + + def getGender(self): + return _py3dna.DescriptorReader_getGender(self) + + def getAge(self): + return _py3dna.DescriptorReader_getAge(self) + + def getMetaDataCount(self): + return _py3dna.DescriptorReader_getMetaDataCount(self) + + def getMetaDataKey(self, index): + r""" + :type index: int + :param index: + A position in the zero-indexed array of key-value pairs. + Warning: + The index must be less than the value returned by getMetaDataCount. + :rtype: :py:class:`StringView` + :return: View over the key name string. + """ + return _py3dna.DescriptorReader_getMetaDataKey(self, index) + + def getMetaDataValue(self, key): + r""" + Stored metadata value associated with the given key. + Notes: + If no value is associated with the given key, the returned view + will contain nullptr and will have a size of 0. + :type key: string + :param key: + A unique-known key that has a value associated to it. + Warning: + The key must be null-terminated. + :rtype: :py:class:`StringView` + :return: View over the metadata value string. + """ + return _py3dna.DescriptorReader_getMetaDataValue(self, key) + + def getTranslationUnit(self): + return _py3dna.DescriptorReader_getTranslationUnit(self) + + def getRotationUnit(self): + return _py3dna.DescriptorReader_getRotationUnit(self) + + def getCoordinateSystem(self): + return _py3dna.DescriptorReader_getCoordinateSystem(self) + + def getLODCount(self): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + """ + return _py3dna.DescriptorReader_getLODCount(self) + + def getDBMaxLOD(self): + r""" + The maximum level of detail stored in the DNA data for this character. + Notes: + The value is relative to LOD-0 from the database. + """ + return _py3dna.DescriptorReader_getDBMaxLOD(self) + + def getDBComplexity(self): + r""" + Name of the input control interface used to drive this character rig. + Notes: + This parameter denotes the character's input control complexity. + """ + return _py3dna.DescriptorReader_getDBComplexity(self) + + def getDBName(self): + r""" + Name of the database from which the character originates. + Notes: + All characters from the same database must have the same Definition, but may + have different complexity or LOD. + """ + return _py3dna.DescriptorReader_getDBName(self) + +# Register DescriptorReader in _py3dna: +_py3dna.DescriptorReader_swigregister(DescriptorReader) +class MeshBlendShapeChannelMapping(object): + r""" Mapping that associates a blend shape channel to it's mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + meshIndex = property(_py3dna.MeshBlendShapeChannelMapping_meshIndex_get, _py3dna.MeshBlendShapeChannelMapping_meshIndex_set) + blendShapeChannelIndex = property(_py3dna.MeshBlendShapeChannelMapping_blendShapeChannelIndex_get, _py3dna.MeshBlendShapeChannelMapping_blendShapeChannelIndex_set) + + def __init__(self): + _py3dna.MeshBlendShapeChannelMapping_swiginit(self, _py3dna.new_MeshBlendShapeChannelMapping()) + __swig_destroy__ = _py3dna.delete_MeshBlendShapeChannelMapping + +# Register MeshBlendShapeChannelMapping in _py3dna: +_py3dna.MeshBlendShapeChannelMapping_swigregister(MeshBlendShapeChannelMapping) +class DefinitionReader(DescriptorReader): + r""" + Read-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getGUIControlCount(self): + return _py3dna.DefinitionReader_getGUIControlCount(self) + + def getGUIControlName(self, index): + r""" + Name of the requested GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Warning: + The index must be less than the value returned by getGUIControlCount. + :rtype: :py:class:`StringView` + :return: View over the GUI control name string. + """ + return _py3dna.DefinitionReader_getGUIControlName(self, index) + + def getRawControlCount(self): + return _py3dna.DefinitionReader_getRawControlCount(self) + + def getRawControlName(self, index): + r""" + Name of the requested raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Warning: + The index must be less than the value returned by getRawControlCount. + :rtype: :py:class:`StringView` + :return: View over the control name string. + """ + return _py3dna.DefinitionReader_getRawControlName(self, index) + + def getJointCount(self): + return _py3dna.DefinitionReader_getJointCount(self) + + def getJointName(self, index): + r""" + Name of the requested joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: :py:class:`StringView` + :return: View over the joint name string. + """ + return _py3dna.DefinitionReader_getJointName(self, index) + + def getJointIndexListCount(self): + r""" + Number of joint index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getJointIndexListCount(self) + + def getJointIndicesForLOD(self, lod): + r""" + List of joint indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which joints are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the joint indices. + See also: getLODCount + See also: getJointName + """ + return _py3dna.DefinitionReader_getJointIndicesForLOD(self, lod) + + def getJointParentIndex(self, index): + r""" + Index of the requested joint's parent. + Notes: + The joint hierarchy may be traversed and reconstructed using this function. Example: + Joint names: [A, B, C, D, E, F, G, H, I] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 6, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + | + H + + I + + Requesting the parent index of joint 5 (joint name: F) would return 4 (joint name: E). + Requesting the parent index of the root joint: 0 (joint name: A) would return the same index 0. + An out of bounds request (an index greater than the number of joints returns UINT16_MAX). + :type index: int + :param index: + The joint index which parent is being requested. + """ + return _py3dna.DefinitionReader_getJointParentIndex(self, index) + + def getBlendShapeChannelCount(self): + return _py3dna.DefinitionReader_getBlendShapeChannelCount(self) + + def getBlendShapeChannelName(self, index): + r""" + Name of the requested blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Warning: + The index must be less than the value returned by BlendShapeChannelExtentReader::getBlendShapeChannelCount. + :rtype: :py:class:`StringView` + :return: View over the blend shape channel name string. + """ + return _py3dna.DefinitionReader_getBlendShapeChannelName(self, index) + + def getBlendShapeChannelIndexListCount(self): + r""" + Number of blend shape channel index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getBlendShapeChannelIndexListCount(self) + + def getBlendShapeChannelIndicesForLOD(self, lod): + r""" + List of blend shape channel indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which blend shape channels are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the blend shape channel indices. + + These LOD indices are not interchangeable with the LOD values from BehaviorReader::getBlendShapeChannelLODs. + See also: getLODCount + See also: getBlendShapeChannelName + """ + return _py3dna.DefinitionReader_getBlendShapeChannelIndicesForLOD(self, lod) + + def getAnimatedMapCount(self): + return _py3dna.DefinitionReader_getAnimatedMapCount(self) + + def getAnimatedMapName(self, index): + r""" + Name of the requested animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Warning: + The index must be less than the value returned by getAnimatedMapCount. + :rtype: :py:class:`StringView` + :return: View over the animated map name string. + """ + return _py3dna.DefinitionReader_getAnimatedMapName(self, index) + + def getAnimatedMapIndexListCount(self): + r""" + Number of animated map index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getAnimatedMapIndexListCount(self) + + def getAnimatedMapIndicesForLOD(self, lod): + r""" + List of animated map indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which animated maps are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the animated map indices. + See also: getLODCount + See also: getAnimatedMapName + """ + return _py3dna.DefinitionReader_getAnimatedMapIndicesForLOD(self, lod) + + def getMeshCount(self): + return _py3dna.DefinitionReader_getMeshCount(self) + + def getMeshName(self, index): + r""" + Name of the requested mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Warning: + The index must be less than the value returned by getMeshCount. + :rtype: :py:class:`StringView` + :return: View over the mesh name string. + """ + return _py3dna.DefinitionReader_getMeshName(self, index) + + def getMeshIndexListCount(self): + r""" + Number of mesh index lists. + Notes: + This value is useful only in the context of DefinitionWriter. + """ + return _py3dna.DefinitionReader_getMeshIndexListCount(self) + + def getMeshIndicesForLOD(self, lod): + r""" + List of mesh indices for the specified LOD. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh indices. + See also: getLODCount + See also: getMeshName + """ + return _py3dna.DefinitionReader_getMeshIndicesForLOD(self, lod) + + def getMeshBlendShapeChannelMappingCount(self): + r""" Number of mesh-blend shape channel mapping items.""" + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingCount(self) + + def getMeshBlendShapeChannelMapping(self, index): + r""" + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + Warning: + The index must be less than the value returned by getMeshBlendShapeChannelMappingCount. + :rtype: :py:class:`MeshBlendShapeChannelMapping` + :return: A structure holding the mesh index and the associated blend shape channel index. + """ + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMapping(self, index) + + def getMeshBlendShapeChannelMappingIndicesForLOD(self, lod): + r""" + List of mesh-blend shape channel mapping indices for the specified LOD. + Notes: + The indices from this list can be used with the getMeshBlendShapeChannelMapping API + to retrieve individual mapping items. + :type lod: int + :param lod: + The level of detail which meshes are being requested. + Warning: + The lod index must be less than the value returned by getLODCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the mesh blend shape channel mapping indices. + See also: getLODCount + See also: getMeshBlendShapeChannelMapping + """ + return _py3dna.DefinitionReader_getMeshBlendShapeChannelMappingIndicesForLOD(self, lod) + + def getNeutralJointTranslation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint translations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's translation (x, y, z). + """ + return _py3dna.DefinitionReader_getNeutralJointTranslation(self, index) + + def getNeutralJointTranslationXs(self): + r""" + List of all translation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationXs(self) + + def getNeutralJointTranslationYs(self): + r""" + List of all translation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationYs(self) + + def getNeutralJointTranslationZs(self): + r""" + List of all translation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointTranslation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointTranslation + """ + return _py3dna.DefinitionReader_getNeutralJointTranslationZs(self) + + def getNeutralJointRotation(self, index): + r""" + :type index: int + :param index: + A joint's position in the zero-indexed array of joint rotations. + Warning: + The index must be less than the value returned by getJointCount. + :rtype: dna::Vector3 + :return: The joint's rotation (x, y, z). + """ + return _py3dna.DefinitionReader_getNeutralJointRotation(self, index) + + def getNeutralJointRotationXs(self): + r""" + List of all rotation X values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationXs(self) + + def getNeutralJointRotationYs(self): + r""" + List of all rotation Y values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationYs(self) + + def getNeutralJointRotationZs(self): + r""" + List of all rotation Z values. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getNeutralJointRotation. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getNeutralJointRotation + """ + return _py3dna.DefinitionReader_getNeutralJointRotationZs(self) + +# Register DefinitionReader in _py3dna: +_py3dna.DefinitionReader_swigregister(DefinitionReader) +class BehaviorReader(DefinitionReader): + r""" + Read-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Reader itself and not this class. + See also: Reader + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getGUIToRawInputIndices(self): + r""" + Input indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getGUIToRawInputIndices(self) + + def getGUIToRawOutputIndices(self): + r""" + Output indices used for mapping gui to raw controls. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getGUIToRawOutputIndices(self) + + def getGUIToRawFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getGUIToRawFromValues(self) + + def getGUIToRawToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getGUIToRawToValues(self) + + def getGUIToRawSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getGUIToRawSlopeValues(self) + + def getGUIToRawCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getGUIToRawCutValues(self) + + def getPSDCount(self): + r""" The number of distinct PSD expressions.""" + return _py3dna.BehaviorReader_getPSDCount(self) + + def getPSDRowIndices(self): + r""" + PSD(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of PSD indices. + """ + return _py3dna.BehaviorReader_getPSDRowIndices(self) + + def getPSDColumnIndices(self): + r""" + Control(input) indices. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of control indices. + """ + return _py3dna.BehaviorReader_getPSDColumnIndices(self) + + def getPSDValues(self): + r""" + Weights associated with each PSD row and column pair. + :rtype: dna::ConstArrayView< float > + :return: View over the array of weights. + """ + return _py3dna.BehaviorReader_getPSDValues(self) + + def getJointRowCount(self): + r""" Number of rows in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorReader_getJointRowCount(self) + + def getJointColumnCount(self): + r""" Number of columns in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorReader_getJointColumnCount(self) + + def getJointVariableAttributeIndices(self, lod): + r""" + Joint attribute indices (output indices) for the requested LOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + """ + return _py3dna.BehaviorReader_getJointVariableAttributeIndices(self, lod) + + def getJointGroupCount(self): + r""" Number of joint groups present in the entire joint matrix.""" + return _py3dna.BehaviorReader_getJointGroupCount(self) + + def getJointGroupLODs(self, jointGroupIndex): + r""" + Number of rows per each level of detail for the requested joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getJointGroupLODs(self, jointGroupIndex) + + def getJointGroupInputIndices(self, jointGroupIndex): + r""" + Column indices that the requested joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of column indices. + """ + return _py3dna.BehaviorReader_getJointGroupInputIndices(self, jointGroupIndex) + + def getJointGroupOutputIndices(self, jointGroupIndex): + r""" + Row indices that the requested joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of row indices. + """ + return _py3dna.BehaviorReader_getJointGroupOutputIndices(self, jointGroupIndex) + + def getJointGroupValues(self, jointGroupIndex): + r""" + Values that the requested joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< float > + :return: View over the array of values. + """ + return _py3dna.BehaviorReader_getJointGroupValues(self, jointGroupIndex) + + def getJointGroupJointIndices(self, jointGroupIndex): + r""" + Joint indices that the requested joint group contains. + Notes: + These joint indices can be used to get the joint names through DefinitionReader::getJointName. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of joint indices. + See also: DefinitionReader + """ + return _py3dna.BehaviorReader_getJointGroupJointIndices(self, jointGroupIndex) + + def getBlendShapeChannelLODs(self): + r""" + Input index count per each level of detail for blend shape channels. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + Warning: + These LOD values are not interchangeable with the LOD indices from DefinitionReader::getBlendShapeChannelIndicesForLOD. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelLODs(self) + + def getBlendShapeChannelInputIndices(self): + r""" + Input indices used to index into the input vector. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelInputIndices(self) + + def getBlendShapeChannelOutputIndices(self): + r""" + Output indices specify the positions of blend shape channel output values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getBlendShapeChannelOutputIndices(self) + + def getAnimatedMapLODs(self): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of LOD bounds. + """ + return _py3dna.BehaviorReader_getAnimatedMapLODs(self) + + def getAnimatedMapInputIndices(self): + r""" + Input indices used to index into the array of input values. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of input indices. + """ + return _py3dna.BehaviorReader_getAnimatedMapInputIndices(self) + + def getAnimatedMapOutputIndices(self): + r""" + Output indices that specify the computed output value's position. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the array of output indices. + """ + return _py3dna.BehaviorReader_getAnimatedMapOutputIndices(self) + + def getAnimatedMapFromValues(self): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getAnimatedMapFromValues(self) + + def getAnimatedMapToValues(self): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :rtype: dna::ConstArrayView< float > + :return: View over the array of filter values. + """ + return _py3dna.BehaviorReader_getAnimatedMapToValues(self) + + def getAnimatedMapSlopeValues(self): + r""" + Computational values(slope/gradient) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getAnimatedMapSlopeValues(self) + + def getAnimatedMapCutValues(self): + r""" + Computational values(vertical intercept) used for calculating the output value. + :rtype: dna::ConstArrayView< float > + :return: View over the array of computational values. + """ + return _py3dna.BehaviorReader_getAnimatedMapCutValues(self) + +# Register BehaviorReader in _py3dna: +_py3dna.BehaviorReader_swigregister(BehaviorReader) +class GeometryReader(DefinitionReader): + r""" + Read-only accessors to the geometry data associated with a rig. + Warning: + Implementors should inherit from Reader itself and not this class. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def getVertexPositionCount(self, meshIndex): + r""" + Number of vertex positions in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexPositionCount(self, meshIndex) + + def getVertexPosition(self, meshIndex, vertexIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + The index of the vertex position in the zero-indexed array of vertex positions. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The vertices are sorted by the vertex ID. + :rtype: dna::Position + :return: The vertex position. + """ + return _py3dna.GeometryReader_getVertexPosition(self, meshIndex, vertexIndex) + + def getVertexPositionXs(self, meshIndex): + r""" + List of all vertex position X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionXs(self, meshIndex) + + def getVertexPositionYs(self, meshIndex): + r""" + List of all vertex position Y values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionYs(self, meshIndex) + + def getVertexPositionZs(self, meshIndex): + r""" + List of all vertex position Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexPosition. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexPosition + """ + return _py3dna.GeometryReader_getVertexPositionZs(self, meshIndex) + + def getVertexTextureCoordinateCount(self, meshIndex): + r""" + Number of texture coordinates in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateCount(self, meshIndex) + + def getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type textureCoordinateIndex: int + :param textureCoordinateIndex: + The index of the texture coordinate in the zero-indexed array of texture coordinates. + + textureCoordinateIndex must be less than the value returned by getVertexTextureCoordinateCount. + :rtype: dna::TextureCoordinate + :return: The texture coordinate. + """ + return _py3dna.GeometryReader_getVertexTextureCoordinate(self, meshIndex, textureCoordinateIndex) + + def getVertexTextureCoordinateUs(self, meshIndex): + r""" + List of all texture coordinate U values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all U values. + See also: getVertexTextureCoordinate + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateUs(self, meshIndex) + + def getVertexTextureCoordinateVs(self, meshIndex): + r""" + List of all texture coordinate V values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexTextureCoordinate. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all V values. + See also: getVertexTextureCoordinate + """ + return _py3dna.GeometryReader_getVertexTextureCoordinateVs(self, meshIndex) + + def getVertexNormalCount(self, meshIndex): + r""" + Number of vertex normals in the entire mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexNormalCount(self, meshIndex) + + def getVertexNormal(self, meshIndex, normalIndex): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type normalIndex: int + :param normalIndex: + The index of the vertex normal in the zero-indexed array of vertex normals. + + normalIndex must be less than the value returned by getVertexNormalCount. + :rtype: dna::Normal + :return: The vertex normal. + """ + return _py3dna.GeometryReader_getVertexNormal(self, meshIndex, normalIndex) + + def getVertexNormalXs(self, meshIndex): + r""" + List of all normal X values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalXs(self, meshIndex) + + def getVertexNormalYs(self, meshIndex): + r""" + List of all normal Y value for the referenced meshs. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalYs(self, meshIndex) + + def getVertexNormalZs(self, meshIndex): + r""" + List of all normal Z values for the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexNormal. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexNormalZs(self, meshIndex) + + def getVertexLayoutCount(self, meshIndex): + r""" + Number of vertex layouts in the entire mesh. + Notes: + A vertex layout is a collection of vertex attributes. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getVertexLayoutCount(self, meshIndex) + + def getVertexLayout(self, meshIndex, layoutIndex): + r""" + Vertex layouts contain only attribute indices which can be used to query + the actual attributes, such as positions, texture coordinates and normals, + which are associated with the vertex. + Notes: + The indices from a layout are usable with the above defined APIs. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type layoutIndex: int + :param layoutIndex: + The index of the layout in the zero-indexed array of vertex layouts. + + layoutIndex must be less than the value returned by getVertexLayoutCount. + See also: getVertexPosition + See also: getVertexTextureCoordinate + See also: getVertexNormal + """ + return _py3dna.GeometryReader_getVertexLayout(self, meshIndex, layoutIndex) + + def getVertexLayoutPositionIndices(self, meshIndex): + r""" + Position indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex position indices values. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutPositionIndices(self, meshIndex) + + def getVertexLayoutTextureCoordinateIndices(self, meshIndex): + r""" + Texture coordinate indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex texture coordinate indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutTextureCoordinateIndices(self, meshIndex) + + def getVertexLayoutNormalIndices(self, meshIndex): + r""" + Normal indices for each vertex of the referenced mesh. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getVertexLayout. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over all vertex normal indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getVertexLayoutNormalIndices(self, meshIndex) + + def getFaceCount(self, meshIndex): + r""" + Number of faces that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getFaceCount(self, meshIndex) + + def getFaceVertexLayoutIndices(self, meshIndex, faceIndex): + r""" + List of vertex layout indices the belong to a face on the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + + faceIndex must be less than the value returned by getFaceCount. + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex layout indices. + See also: getVertexLayout + """ + return _py3dna.GeometryReader_getFaceVertexLayoutIndices(self, meshIndex, faceIndex) + + def getMaximumInfluencePerVertex(self, meshIndex): + r""" + The maximum number of joints that may influence any single vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getMaximumInfluencePerVertex(self, meshIndex) + + def getSkinWeightsCount(self, meshIndex): + r""" + Number of skin weights associated with the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getSkinWeightsCount(self, meshIndex) + + def getSkinWeightsValues(self, meshIndex, vertexIndex): + r""" + List of skin weights influencing the requested vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + :rtype: dna::ConstArrayView< float > + :return: View over the list of skin weights. + """ + return _py3dna.GeometryReader_getSkinWeightsValues(self, meshIndex, vertexIndex) + + def getSkinWeightsJointIndices(self, meshIndex, vertexIndex): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertices. + + vertexIndex must be less than the value returned by getVertexPositionCount. + Notes: + The joint indices are stored in the same order as the weights they + are associated with. + :rtype: dna::ConstArrayView< std::uint16_t > + :return: View over the list of joint indices. + """ + return _py3dna.GeometryReader_getSkinWeightsJointIndices(self, meshIndex, vertexIndex) + + def getBlendShapeTargetCount(self, meshIndex): + r""" + Number of blend shapes that belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetCount(self, meshIndex) + + def getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex): + r""" + The matching blend shape channel index of the requested blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + See also: DefinitionReader::getBlendShapeChannelName + """ + return _py3dna.GeometryReader_getBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex): + r""" + Number of deltas that belong to the specified blend shape. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaCount(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :type deltaIndex: int + :param deltaIndex: + A position in the zero-indexed array of blend shapes deltas. + + deltaIndex must be less than the value returned by getBlendShapeTargetDeltaCount. + """ + return _py3dna.GeometryReader_getBlendShapeTargetDelta(self, meshIndex, blendShapeTargetIndex, deltaIndex) + + def getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta X values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all X values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaXs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Y values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Y values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaYs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex): + r""" + List of all delta Z values for the referenced blend shape target. + Notes: + This is an advanced API for performance critical access, for more convenient usage see getBlendShapeTargetDelta. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + :rtype: dna::ConstArrayView< float > + :return: View over all Z values. + See also: getBlendShapeTargetDelta + """ + return _py3dna.GeometryReader_getBlendShapeTargetDeltaZs(self, meshIndex, blendShapeTargetIndex) + + def getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex): + r""" + Vertex position indices affected by the referenced blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + + blendShapeTargetIndex must be less than the value returned by getBlendShapeTargetCount. + Notes: + The vertex position indices are stored in the same order as the deltas they + are associated with. + These indices can be used to query the associated vertices themselves through getVertexPosition. + See also: getVertexPosition + :rtype: dna::ConstArrayView< std::uint32_t > + :return: View over the list of vertex position indices. + """ + return _py3dna.GeometryReader_getBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex) + +# Register GeometryReader in _py3dna: +_py3dna.GeometryReader_swigregister(GeometryReader) +class Reader(BehaviorReader, GeometryReader): + r""" + The abstract Reader which its implementations are expected to inherit. + Notes: + This class combines the various different reader interfaces into a single interface. + The artificial separation into multiple interfaces mirrors the DNA file structure that + is separated into matching layers under the same names. As these layers can be + selectively loaded, it might be convenient to slice-off interfaces which layers were + not loaded. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_Reader + + def unload(self, layer): + r""" + Unload all data of the specified layer and all layers dependent on it. + :type layer: int + :param layer: + Layer which data should be unloaded. + """ + return _py3dna.Reader_unload(self, layer) + +# Register Reader in _py3dna: +_py3dna.Reader_swigregister(Reader) +class StreamReader(Reader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_StreamReader + + def read(self): + r""" read data from stream into internal structures.""" + return _py3dna.StreamReader_read(self) + +# Register StreamReader in _py3dna: +_py3dna.StreamReader_swigregister(StreamReader) +StreamReader.SignatureMismatchError = _py3dna.cvar.StreamReader_SignatureMismatchError +StreamReader.VersionMismatchError = _py3dna.cvar.StreamReader_VersionMismatchError +StreamReader.InvalidDataError = _py3dna.cvar.StreamReader_InvalidDataError + +class BinaryStreamReader(StreamReader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + r""" + *Overload 1:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int, optional + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int, optional + :param maxLOD: + The maximum level of details to be loaded. + + A value of zero indicates to load all LODs. + Warning: + The maxLOD value must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 2:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 3:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type maxLOD: int + :param maxLOD: + The maximum level of details to be loaded. + :type minLOD: int + :param minLOD: + The minimum level of details to be loaded. + + A range of [0, LOD count - 1] for maxLOD / minLOD respectively indicates to load all LODs. + Warning: + Both maxLOD and minLOD values must be less than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 4:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + + | + + *Overload 5:* + + Factory method for creation of BinaryStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type layer: int + :param layer: + Specify the layer up to which the data needs to be loaded. + Notes: + The Definition data layer depends on and thus implicitly loads the Descriptor layer. + The Behavior data layer depends on and thus implicitly loads the Definition layer. + The Geometry data layer depends on and thus also implicitly loads the Definition layer. + :type lods: int + :param lods: + An array specifying which exact lods to load. + Warning: + All values in the array must be less than the value returned by getLODCount. + See also: getLODCount + :type lodCount: int + :param lodCount: + The number of elements in the lods array. + + There cannot be more elements in the array than the value returned by getLODCount. + See also: getLODCount + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamReader_create(*args) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a BinaryStreamReader instance. + :type instance: :py:class:`BinaryStreamReader` + :param instance: + Instance of BinaryStreamReader to be freed. + See also: create + """ + return _py3dna.BinaryStreamReader_destroy(instance) + __swig_destroy__ = _py3dna.delete_BinaryStreamReader + +# Register BinaryStreamReader in _py3dna: +_py3dna.BinaryStreamReader_swigregister(BinaryStreamReader) +class JSONStreamReader(StreamReader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, memRes=None): + r""" + Factory method for creation of JSONStreamReader + :type stream: :py:class:`BoundedIOStream` + :param stream: + Source stream from which data is going to be read. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamReader_create(stream, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a JSONStreamReader instance. + :type instance: :py:class:`JSONStreamReader` + :param instance: + Instance of JSONStreamReader to be freed. + See also: create + """ + return _py3dna.JSONStreamReader_destroy(instance) + __swig_destroy__ = _py3dna.delete_JSONStreamReader + +# Register JSONStreamReader in _py3dna: +_py3dna.JSONStreamReader_swigregister(JSONStreamReader) + +BinaryStreamReaderImpl = BinaryStreamReader + +class BinaryStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamReaderImpl) if name not in ("create","destroy")] + +class BinaryStreamReader(with_metaclass(BinaryStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamReaderImpl = JSONStreamReader + +class JSONStreamReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamReaderImpl) if name not in ("create","destroy")] + +class JSONStreamReader(with_metaclass(JSONStreamReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamReaderImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + +class DescriptorWriter(object): + r""" + Write-only accessors to various metadata about the character and the rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def setName(self, name): + r""" + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an allocation. + """ + return _py3dna.DescriptorWriter_setName(self, name) + + def setArchetype(self, archetype): + return _py3dna.DescriptorWriter_setArchetype(self, archetype) + + def setGender(self, gender): + return _py3dna.DescriptorWriter_setGender(self, gender) + + def setAge(self, age): + return _py3dna.DescriptorWriter_setAge(self, age) + + def clearMetaData(self): + r""" Empties the metadata storage, delete all key-value pairs.""" + return _py3dna.DescriptorWriter_clearMetaData(self) + + def setMetaData(self, key, value): + r""" + Associate the metadata value with the given key. + :type key: string + :param key: + A unique, null-terminated key, to which the given value will be assigned. + :type value: string + :param value: + A null-terminated, metadata value, which is to be assigned to the given key. + Notes: + Consecutive calls using the same key will overwrite any existing data. + + Passing nullptr as the value argument will cause the associated key to be deleted. + """ + return _py3dna.DescriptorWriter_setMetaData(self, key, value) + + def setTranslationUnit(self, unit): + return _py3dna.DescriptorWriter_setTranslationUnit(self, unit) + + def setRotationUnit(self, unit): + return _py3dna.DescriptorWriter_setRotationUnit(self, unit) + + def setCoordinateSystem(self, system): + return _py3dna.DescriptorWriter_setCoordinateSystem(self, system) + + def setLODCount(self, lodCount): + r""" + Available levels of detail (e.g. 6 which means the following levels are available: + [0,1,2,3,4,5], where 0 is the LOD with the highest details, and 5 is the LOD with + lowest details). + :type lodCount: int + :param lodCount: + The number of levels available. + """ + return _py3dna.DescriptorWriter_setLODCount(self, lodCount) + + def setDBMaxLOD(self, lod): + r""" The maximum level of detail stored in the DNA data for this character.""" + return _py3dna.DescriptorWriter_setDBMaxLOD(self, lod) + + def setDBComplexity(self, name): + r""" + Name of the input control interface used to drive this character rig. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DescriptorWriter_setDBComplexity(self, name) + + def setDBName(self, name): + r""" + Name of the database from which the character originates. + :type name: string + :param name: + A null-terminated string. + Notes: + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DescriptorWriter_setDBName(self, name) + +# Register DescriptorWriter in _py3dna: +_py3dna.DescriptorWriter_swigregister(DescriptorWriter) +class DefinitionWriter(DescriptorWriter): + r""" + Write-only accessors for DNA attributes that represent the rig's static data. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def clearGUIControlNames(self): + r""" Delete all stored GUI control names.""" + return _py3dna.DefinitionWriter_clearGUIControlNames(self) + + def setGUIControlName(self, index, name): + r""" + Name of the specified GUI control. + :type index: int + :param index: + A name's position in the zero-indexed array of GUI control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setGUIControlName(self, index, name) + + def clearRawControlNames(self): + r""" Delete all stored raw control names.""" + return _py3dna.DefinitionWriter_clearRawControlNames(self) + + def setRawControlName(self, index, name): + r""" + Name of the specified raw control. + :type index: int + :param index: + A name's position in the zero-indexed array of raw control names. + Notes: + The control name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setRawControlName(self, index, name) + + def clearJointNames(self): + r""" Delete all stored joint names.""" + return _py3dna.DefinitionWriter_clearJointNames(self) + + def setJointName(self, index, name): + r""" + Name of the specified joint. + :type index: int + :param index: + A name's position in the zero-indexed array of joint names. + Notes: + The joint name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setJointName(self, index, name) + + def clearJointIndices(self): + r""" Delete all stored joint indices.""" + return _py3dna.DefinitionWriter_clearJointIndices(self) + + def setJointIndices(self, index, jointIndices): + r""" + Store a list of joint indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where joint indices are stored. + Notes: + The index denotes the position of an entire joint index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of joint indices. + + The joint index storage will be implicitly resized (if needed) to provide + storage for the number of joint indices that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.DefinitionWriter_setJointIndices(self, index, jointIndices) + + def clearLODJointMappings(self): + r""" Delete all stored LOD to joint list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODJointMappings(self) + + def setLODJointMapping(self, lod, index): + r""" + Set which joints belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the joints are being associated. + :type index: int + :param index: + The index onto which joints indices were assigned using setJointIndices. + See also: setJointIndices + """ + return _py3dna.DefinitionWriter_setLODJointMapping(self, lod, index) + + def clearBlendShapeChannelNames(self): + r""" Delete all stored blend shape channel names.""" + return _py3dna.DefinitionWriter_clearBlendShapeChannelNames(self) + + def setBlendShapeChannelName(self, index, name): + r""" + Name of the specified blend shape channel. + :type index: int + :param index: + A name's position in the zero-indexed array of blend shape channel names. + Notes: + The blend shape channel name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setBlendShapeChannelName(self, index, name) + + def clearBlendShapeChannelIndices(self): + r""" Delete all stored blend shape channel indices.""" + return _py3dna.DefinitionWriter_clearBlendShapeChannelIndices(self) + + def setBlendShapeChannelIndices(self, index, blendShapeChannelIndices): + r""" + Store a list of blend shape channel name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where blend shape channel name indices are stored. + Notes: + The index denotes the position of an entire blend shape channel index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of blend shape channel indices. + + The blend shape channel index storage will be implicitly resized (if needed) to provide storage + for the number of blend shape channel name indices that is inferred from the specified index. + :type blendShapeChannelIndices: int + :param blendShapeChannelIndices: + The source address from which the blend shape channel name indices are to be copied. + + These indices can be used to access blend shape channel names through DefinitionReader::getBlendShapeChannelName. + :type count: int + :param count: + The number of blend shape channel name indices to copy. + """ + return _py3dna.DefinitionWriter_setBlendShapeChannelIndices(self, index, blendShapeChannelIndices) + + def clearLODBlendShapeChannelMappings(self): + r""" Delete all stored LOD to blend shape channel list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODBlendShapeChannelMappings(self) + + def setLODBlendShapeChannelMapping(self, lod, index): + r""" + Set which blend shape channels belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the blend shape channels are being associated. + :type index: int + :param index: + The index onto which blend shape channel name indices were assigned using setBlendShapeChannelIndices. + Warning: + The LOD indices set here are not interchangeable with the LOD values set in BehaviorWriter::setBlendShapeChannelLODs. + See also: setBlendShapeChannelIndices + """ + return _py3dna.DefinitionWriter_setLODBlendShapeChannelMapping(self, lod, index) + + def clearAnimatedMapNames(self): + r""" Delete all stored animated map names.""" + return _py3dna.DefinitionWriter_clearAnimatedMapNames(self) + + def setAnimatedMapName(self, index, name): + r""" + Name of the specified animated map. + :type index: int + :param index: + A name's position in the zero-indexed array of animated map names. + Notes: + The animated map name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setAnimatedMapName(self, index, name) + + def clearAnimatedMapIndices(self): + r""" Delete all stored animated map indices.""" + return _py3dna.DefinitionWriter_clearAnimatedMapIndices(self) + + def setAnimatedMapIndices(self, index, animatedMapIndices): + r""" + Store a list of animated map name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where animated map name indices are stored. + Notes: + The index denotes the position of an entire animated map index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of animated map indices. + + The animated map index storage will be implicitly resized (if needed) to provide storage + for the number of animated map name indices that is inferred from the specified index. + :type animatedMapIndices: int + :param animatedMapIndices: + The source address from which the animated map name indices are to be copied. + + These indices can be used to access animated map names through DefinitionReader::getAnimatedMapName. + :type count: int + :param count: + The number of animated map name indices to copy. + """ + return _py3dna.DefinitionWriter_setAnimatedMapIndices(self, index, animatedMapIndices) + + def clearLODAnimatedMapMappings(self): + r""" Delete all stored LOD to animated map list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODAnimatedMapMappings(self) + + def setLODAnimatedMapMapping(self, lod, index): + r""" + Set which animated maps belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the animated maps are being associated. + :type index: int + :param index: + The index onto which animated map indices were assigned using setAnimatedMapIndices. + See also: setAnimatedMapIndices + """ + return _py3dna.DefinitionWriter_setLODAnimatedMapMapping(self, lod, index) + + def clearMeshNames(self): + r""" Delete all stored mesh names.""" + return _py3dna.DefinitionWriter_clearMeshNames(self) + + def setMeshName(self, index, name): + r""" + Name of the specified mesh. + :type index: int + :param index: + A name's position in the zero-indexed array of mesh names. + Notes: + The mesh name storage will be implicitly resized (if needed) to provide + storage for the number of names that is inferred from the specified index. + :type name: string + :param name: + A null-terminated string. + + The passed in name is copied, which will involve an additional allocation. + """ + return _py3dna.DefinitionWriter_setMeshName(self, index, name) + + def clearMeshIndices(self): + r""" Delete all stored mesh indices.""" + return _py3dna.DefinitionWriter_clearMeshIndices(self) + + def setMeshIndices(self, index, meshIndices): + r""" + Store a list of mesh name indices onto a specified index. + :type index: int + :param index: + A position in a zero-indexed array where mesh name indices are stored. + Notes: + The index denotes the position of an entire mesh index list, + not the position of it's individual elements, i.e. the row index in a 2D + matrix of mesh indices. + + The mesh index storage will be implicitly resized (if needed) to provide storage + for the number of mesh name indices that is inferred from the specified index. + :type meshIndices: int + :param meshIndices: + The source address from which the mesh name indices are to be copied. + + These indices can be used to access mesh names through DefinitionReader::getMeshName. + :type count: int + :param count: + The number of mesh name indices to copy. + """ + return _py3dna.DefinitionWriter_setMeshIndices(self, index, meshIndices) + + def clearLODMeshMappings(self): + r""" Delete all stored LOD to mesh list index mapping entries.""" + return _py3dna.DefinitionWriter_clearLODMeshMappings(self) + + def setLODMeshMapping(self, lod, index): + r""" + Set which meshes belong to which level of detail. + :type lod: int + :param lod: + The actual level of detail to which the meshes are being associated. + :type index: int + :param index: + The index onto which mesh indices were assigned using setMeshIndices. + See also: setMeshIndices + """ + return _py3dna.DefinitionWriter_setLODMeshMapping(self, lod, index) + + def clearMeshBlendShapeChannelMappings(self): + r""" Delete all stored mesh to blend shape channel mapping entries.""" + return _py3dna.DefinitionWriter_clearMeshBlendShapeChannelMappings(self) + + def setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex): + r""" + Associate a blend shape channel with it's mesh. + :type index: int + :param index: + A mapping's position in the zero-indexed array of mesh-blend shape channel mappings. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of mesh names. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + A blend shape channel's position in the zero-indexed array of blend shape channel names. + """ + return _py3dna.DefinitionWriter_setMeshBlendShapeChannelMapping(self, index, meshIndex, blendShapeChannelIndex) + + def setJointHierarchy(self, jointIndices): + r""" + A simple array describing the parent-child relationships between joints. + Notes: + Example: + Joint names: [A, B, C, D, E, F, G, H] + Hierarchy: [0, 0, 0, 1, 1, 4, 2, 2] + Describes the following hierarchy: + A + + B + | + D + | + E + | + F + + C + + G + + H + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + + These indices can be used to access joint names through DefinitionReader::getJointName. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.DefinitionWriter_setJointHierarchy(self, jointIndices) + + def setNeutralJointTranslations(self, translations): + r""" + :type translations: dna::Vector3 + :param translations: + The source address from which the translations are to be copied. + :type count: int + :param count: + The number of translation values to copy. + """ + return _py3dna.DefinitionWriter_setNeutralJointTranslations(self, translations) + + def setNeutralJointRotations(self, rotations): + r""" + :type rotations: dna::Vector3 + :param rotations: + The source address from which the rotations are to be copied. + :type count: int + :param count: + The number of rotation values to copy. + """ + return _py3dna.DefinitionWriter_setNeutralJointRotations(self, rotations) + +# Register DefinitionWriter in _py3dna: +_py3dna.DefinitionWriter_swigregister(DefinitionWriter) +class BehaviorWriter(DefinitionWriter): + r""" + Write-only accessors for DNA attributes that define the rig's evaluation. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def setGUIToRawInputIndices(self, inputIndices): + r""" + Input indices used for mapping gui to raw controls. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawInputIndices(self, inputIndices) + + def setGUIToRawOutputIndices(self, outputIndices): + r""" + Output indices used for mapping gui to raw controls. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawOutputIndices(self, outputIndices) + + def setGUIToRawFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawFromValues(self, fromValues) + + def setGUIToRawToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not during gui to raw control mapping. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawToValues(self, toValues) + + def setGUIToRawSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the + output value during gui to raw control mapping. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawSlopeValues(self, slopeValues) + + def setGUIToRawCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the + output value during gui to raw control mapping. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setGUIToRawCutValues(self, cutValues) + + def setPSDCount(self, count): + r""" The number of distinct PSD expressions.""" + return _py3dna.BehaviorWriter_setPSDCount(self, count) + + def setPSDRowIndices(self, rowIndices): + r""" + PSD(input) indices which will become the rows of the PSD matrix. + :type rowIndices: int + :param rowIndices: + The source address from which the PSD indices are to be copied. + :type count: int + :param count: + The number of PSD indices to copy. + """ + return _py3dna.BehaviorWriter_setPSDRowIndices(self, rowIndices) + + def setPSDColumnIndices(self, columnIndices): + r""" + Control(input) indices which will become the columns of the PSD matrix. + :type columnIndices: int + :param columnIndices: + The source address from which the control indices are to be copied. + :type count: int + :param count: + The number of control indices to copy. + """ + return _py3dna.BehaviorWriter_setPSDColumnIndices(self, columnIndices) + + def setPSDValues(self, weights): + r""" + Weights associated with each PSD row and column pair. + :type weights: float + :param weights: + The source address from which the weight values are to be copied. + :type count: int + :param count: + The number of weight values to copy. + """ + return _py3dna.BehaviorWriter_setPSDValues(self, weights) + + def setJointRowCount(self, rowCount): + r""" Number of rows in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorWriter_setJointRowCount(self, rowCount) + + def setJointColumnCount(self, columnCount): + r""" Number of columns in the entire, uncompressed joint matrix.""" + return _py3dna.BehaviorWriter_setJointColumnCount(self, columnCount) + + def clearJointGroups(self): + r""" Delete all joint groups.""" + return _py3dna.BehaviorWriter_clearJointGroups(self) + + def deleteJointGroup(self, jointGroupIndex): + r""" + Delete the specified joint group. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Warning: + jointGroupIndex must be less than the value returned by getJointGroupCount. + """ + return _py3dna.BehaviorWriter_deleteJointGroup(self, jointGroupIndex) + + def setJointGroupLODs(self, jointGroupIndex, lods): + r""" + Number of rows per each level of detail for the specified joint group. + Notes: + Each element's position represents the level itself, while the value denotes + the number of rows within the joint group belonging to that level. e.g.: + [12, 9, 3] + | | + LOD-2 contains first 3 rows + | + LOD-1 contains first 9 rows + + LOD-0 contains first 12 rows + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupLODs(self, jointGroupIndex, lods) + + def setJointGroupInputIndices(self, jointGroupIndex, inputIndices): + r""" + Column indices that the specified joint group contains. + Notes: + The column indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type inputIndices: int + :param inputIndices: + The source address from which the column indices are to be copied. + :type count: int + :param count: + The number of column indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupInputIndices(self, jointGroupIndex, inputIndices) + + def setJointGroupOutputIndices(self, jointGroupIndex, outputIndices): + r""" + Row indices that the specified joint group contains. + Notes: + The row indices point into the entire, uncompressed joint matrix. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type outputIndices: int + :param outputIndices: + The source address from which the row indices are to be copied. + :type count: int + :param count: + The number of row indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupOutputIndices(self, jointGroupIndex, outputIndices) + + def setJointGroupValues(self, jointGroupIndex, values): + r""" + Values that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type values: float + :param values: + The source address from which the values are to be copied. + :type count: int + :param count: + The number of values to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupValues(self, jointGroupIndex, values) + + def setJointGroupJointIndices(self, jointGroupIndex, jointIndices): + r""" + Joint indices that the specified joint group contains. + :type jointGroupIndex: int + :param jointGroupIndex: + A joint group's position in the zero-indexed array of joint groups. + Notes: + The joint group storage will be implicitly resized (if needed) to provide + storage for the number of joint groups that is inferred from the specified index. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + """ + return _py3dna.BehaviorWriter_setJointGroupJointIndices(self, jointGroupIndex, jointIndices) + + def setBlendShapeChannelLODs(self, lods): + r""" + Input index count per each level of detail for blend shapes. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of input indices belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + Warning: + The LOD values set here are not interchangeable with the LOD indices set in DefinitionWriter::setBlendShapeNameIndices + and DefinitionWriter::setLODBlendShapeMapping + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelLODs(self, lods) + + def setBlendShapeChannelInputIndices(self, inputIndices): + r""" + Input indices used to index into the input vector. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelInputIndices(self, inputIndices) + + def setBlendShapeChannelOutputIndices(self, outputIndices): + r""" + Output indices specify the positions of blend shape output values. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setBlendShapeChannelOutputIndices(self, outputIndices) + + def setAnimatedMapLODs(self, lods): + r""" + Row count per each level of detail for animated maps. + Notes: + Each element's position represents the level itself (e.g. [0,1,2,3,4,5] Value 0 is LOD with highest of details, + value 5 is LOD with lowest details), while the value denotes the number of rows (within the conditional table), + belonging to that level. + :type lods: int + :param lods: + The source address from which the lod bounds are to be copied. + :type count: int + :param count: + The number of lod bounds to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapLODs(self, lods) + + def setAnimatedMapInputIndices(self, inputIndices): + r""" + Input indices used to index into the array of input values. + :type inputIndices: int + :param inputIndices: + The source address from which the input indices are to be copied. + :type count: int + :param count: + The number of input indices to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapInputIndices(self, inputIndices) + + def setAnimatedMapOutputIndices(self, outputIndices): + r""" + Output indices that specify the computed output value's position. + :type outputIndices: int + :param outputIndices: + The source address from which the output indices are to be copied. + :type count: int + :param count: + The number of output indices to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapOutputIndices(self, outputIndices) + + def setAnimatedMapFromValues(self, fromValues): + r""" + Filter values(lower-bounds) used to decide whether a particular + entry should be evaluated or not. + :type fromValues: float + :param fromValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapFromValues(self, fromValues) + + def setAnimatedMapToValues(self, toValues): + r""" + Filter values(upper-bounds) used to decide whether a particular + entry should be evaluated or not. + :type toValues: float + :param toValues: + The source address from which the filter values are to be copied. + :type count: int + :param count: + The number of filter values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapToValues(self, toValues) + + def setAnimatedMapSlopeValues(self, slopeValues): + r""" + Computational values(slope/gradient) used for calculating the output value. + :type slopeValues: float + :param slopeValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapSlopeValues(self, slopeValues) + + def setAnimatedMapCutValues(self, cutValues): + r""" + Computational values(vertical intercept) used for calculating the output value. + :type cutValues: float + :param cutValues: + The source address from which the computational values are to be copied. + :type count: int + :param count: + The number of computational values to copy. + """ + return _py3dna.BehaviorWriter_setAnimatedMapCutValues(self, cutValues) + +# Register BehaviorWriter in _py3dna: +_py3dna.BehaviorWriter_swigregister(BehaviorWriter) +class GeometryWriter(DefinitionWriter): + r""" + Write-only accessors for the geometry data associated with a rig. + Warning: + Implementors should inherit from Writer itself and not this class. + See also: Writer + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def clearMeshes(self): + r""" Delete all meshes.""" + return _py3dna.GeometryWriter_clearMeshes(self) + + def deleteMesh(self, meshIndex): + r""" + Delete the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_deleteMesh(self, meshIndex) + + def setVertexPositions(self, meshIndex, positions): + r""" + List of vertex positions. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type positions: dna::Position + :param positions: + The source address from which the vertex positions are to be copied. + :type count: int + :param count: + The number of vertex positions to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexPositions(self, meshIndex, positions) + + def setVertexTextureCoordinates(self, meshIndex, textureCoordinates): + r""" + List of vertex texture coordinates. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type textureCoordinates: dna::TextureCoordinate + :param textureCoordinates: + The source address from which the texture coordinates are to be copied. + :type count: int + :param count: + The number of texture coordinates to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexTextureCoordinates(self, meshIndex, textureCoordinates) + + def setVertexNormals(self, meshIndex, normals): + r""" + List of vertex normals. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type normals: dna::Normal + :param normals: + The source address from which the normals are to be copied. + :type count: int + :param count: + The number of normals to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexNormals(self, meshIndex, normals) + + def setVertexLayouts(self, meshIndex, layouts): + r""" + List of vertex layouts the belong to the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type layouts: dna::VertexLayout + :param layouts: + The source address from which the layouts are to be copied. + :type count: int + :param count: + The number of layouts to copy. + Notes: + The mesh storage will be implicitly resized (if needed) to provide + storage for the number of meshes that is inferred from the specified index. + """ + return _py3dna.GeometryWriter_setVertexLayouts(self, meshIndex, layouts) + + def clearFaceVertexLayoutIndices(self, meshIndex): + r""" + Delete all lists of vertex layout indices for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearFaceVertexLayoutIndices(self, meshIndex) + + def setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices): + r""" + Vertex layout indices that belong to the specified face. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type faceIndex: int + :param faceIndex: + A face's position in the zero-indexed array of faces that belong to + the above referenced mesh. + :type layoutIndices: int + :param layoutIndices: + The source address from which the layout indices are to be copied. + Notes: + The layout indices point into the array that is set through setVertexLayouts + :type count: int + :param count: + The number of vertices to copy. + + Both the mesh storage itself and it's face storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + faces that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setFaceVertexLayoutIndices(self, meshIndex, faceIndex, layoutIndices) + + def setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount): + r""" + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type maxInfluenceCount: int + :param maxInfluenceCount: + The maximum number of joints that may influence any single vertex. + """ + return _py3dna.GeometryWriter_setMaximumInfluencePerVertex(self, meshIndex, maxInfluenceCount) + + def clearSkinWeights(self, meshIndex): + r""" + Delete all skin weights for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearSkinWeights(self, meshIndex) + + def setSkinWeightsValues(self, meshIndex, vertexIndex, weights): + r""" + List of skin weights influencing the referenced vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type weights: float + :param weights: + The source address from which the weights are to be copied. + :type count: int + :param count: + The number of weights to copy. + Notes: + Both the mesh storage itself and it's skin weight storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + skin-weight lists that are inferred from the specified indexes. + Warning: + The sum of weights must add up to 1. + """ + return _py3dna.GeometryWriter_setSkinWeightsValues(self, meshIndex, vertexIndex, weights) + + def setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices): + r""" + List of joint indices associated with each skin weight for the specified vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type vertexIndex: int + :param vertexIndex: + A position in the zero-indexed array of vertex positions. + :type jointIndices: int + :param jointIndices: + The source address from which the joint indices are to be copied. + :type count: int + :param count: + The number of joint indices to copy. + Notes: + Both the mesh storage itself and it's joint index list storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + joint index lists that are inferred from the specified indexes. + Warning: + The joint indices must be stored in the same order as the weights they + are associated with. + """ + return _py3dna.GeometryWriter_setSkinWeightsJointIndices(self, meshIndex, vertexIndex, jointIndices) + + def clearBlendShapeTargets(self, meshIndex): + r""" + Delete all blend shape targets for the specified mesh. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + Warning: + meshIndex must be less than the value returned by getMeshCount. + """ + return _py3dna.GeometryWriter_clearBlendShapeTargets(self, meshIndex) + + def setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex): + r""" + The matching blend shape channel index of the specified blend shape target. + Notes: + Associate the mesh-local blend shape target index with the absolute blend shape channel + index as found in the Definition layer. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type blendShapeChannelIndex: int + :param blendShapeChannelIndex: + The index of the specified blend shape channel in the Definition layer. + + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setBlendShapeChannelIndex(self, meshIndex, blendShapeTargetIndex, blendShapeChannelIndex) + + def setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas): + r""" + List of deltas for each affected vertex. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type deltas: dna::Delta + :param deltas: + The source address from which the blend shape target deltas are to be copied. + :type count: int + :param count: + The number of blend shape target deltas to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + """ + return _py3dna.GeometryWriter_setBlendShapeTargetDeltas(self, meshIndex, blendShapeTargetIndex, deltas) + + def setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices): + r""" + Vertex position indices affected by the specified blend shape target. + :type meshIndex: int + :param meshIndex: + A mesh's position in the zero-indexed array of meshes. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + A position in the zero-indexed array of blend shape targets within the specified mesh. + :type vertexIndices: int + :param vertexIndices: + The source address from which the vertex position indices are to be copied. + :type count: int + :param count: + The number of vertex position indices to copy. + Notes: + Both the mesh storage itself and it's blend shape target storage will be implicitly + resized (if needed) to provide storage for the number of meshes and/or + blend shape targets that are inferred from the specified indexes. + Warning: + The vertex position indices must be stored in the same order as the deltas + they are associated with. + """ + return _py3dna.GeometryWriter_setBlendShapeTargetVertexIndices(self, meshIndex, blendShapeTargetIndex, vertexIndices) + +# Register GeometryWriter in _py3dna: +_py3dna.GeometryWriter_swigregister(GeometryWriter) +class Writer(BehaviorWriter, GeometryWriter): + r""" + The abstract Writer which its implementations are expected to inherit. + Notes: + This class combines the various different writer interfaces into a single interface. + The artificial separation into multiple interfaces in this case just mirrors the + structure of the Reader hierarchy, as it's not possible to selectively write only + specific layers. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_Writer + + def setFrom(self, *args): + r""" + Initialize the Writer from the given Reader. + Notes: + This function copies all the data from the given Reader into the Writer instance, + by calling each getter function of the Reader, and passing the return values to + the matching setter functions in the Writer. + It is implemented in the abstract class itself to provide the functionality for + all DNA Writers. + :type source: :py:class:`Reader` + :param source: + The source DNA Reader from which the data needs to be copied. + :type layer: int, optional + :param layer: + Limit which layers should be taken over from the given source reader. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Optional memory resource to use for temporary allocations during copying. + """ + return _py3dna.Writer_setFrom(self, *args) + +# Register Writer in _py3dna: +_py3dna.Writer_swigregister(Writer) +class StreamWriter(Writer): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dna.delete_StreamWriter + + def write(self): + r""" Write data to stream from internal structures.""" + return _py3dna.StreamWriter_write(self) + +# Register StreamWriter in _py3dna: +_py3dna.StreamWriter_swigregister(StreamWriter) +class BinaryStreamWriter(StreamWriter): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, memRes=None): + r""" + Factory method for creation of BinaryStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.BinaryStreamWriter_create(stream, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a BinaryStreamWriter instance. + :type instance: :py:class:`BinaryStreamWriter` + :param instance: + Instance of BinaryStreamWriter to be freed. + See also: create + """ + return _py3dna.BinaryStreamWriter_destroy(instance) + __swig_destroy__ = _py3dna.delete_BinaryStreamWriter + +# Register BinaryStreamWriter in _py3dna: +_py3dna.BinaryStreamWriter_swigregister(BinaryStreamWriter) +class JSONStreamWriter(StreamWriter): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(stream, indentWidth=4, memRes=None): + r""" + Factory method for creation of JSONStreamWriter + :type stream: :py:class:`BoundedIOStream` + :param stream: + Stream into which the data is going to be written. + :type indentWidth: int, optional + :param indentWidth: + Number of spaces to use for indentation. + :type memRes: :py:class:`MemoryResource`, optional + :param memRes: + Memory resource to be used for allocations. + Notes: + If a memory resource is not given, a default allocation mechanism will be used. + Warning: + User is responsible for releasing the returned pointer by calling destroy. + See also: destroy + """ + return _py3dna.JSONStreamWriter_create(stream, indentWidth, memRes) + + @staticmethod + def destroy(instance): + r""" + Method for freeing a JSONStreamWriter instance. + :type instance: :py:class:`JSONStreamWriter` + :param instance: + Instance of JSONStreamWriter to be freed. + See also: create + """ + return _py3dna.JSONStreamWriter_destroy(instance) + __swig_destroy__ = _py3dna.delete_JSONStreamWriter + +# Register JSONStreamWriter in _py3dna: +_py3dna.JSONStreamWriter_swigregister(JSONStreamWriter) + +BinaryStreamWriterImpl = BinaryStreamWriter + +class BinaryStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(BinaryStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(BinaryStreamWriterImpl) if name not in ("create","destroy")] + +class BinaryStreamWriter(with_metaclass(BinaryStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = BinaryStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + BinaryStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + +JSONStreamWriterImpl = JSONStreamWriter + +class JSONStreamWriterImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(JSONStreamWriterImpl, name) + + def __dir__(cls): + return [name for name in dir(JSONStreamWriterImpl) if name not in ("create","destroy")] + +class JSONStreamWriter(with_metaclass(JSONStreamWriterImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = JSONStreamWriterImpl.create(*args, **kwargs) + + def __del__(self): + JSONStreamWriterImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + + diff --git a/lib/Maya2024/windows/dnacalib.dll b/lib/Maya2024/windows/dnacalib.dll new file mode 100644 index 00000000..ed49237b Binary files /dev/null and b/lib/Maya2024/windows/dnacalib.dll differ diff --git a/lib/Maya2024/windows/dnacalib.py b/lib/Maya2024/windows/dnacalib.py new file mode 100644 index 00000000..49cf7ee9 --- /dev/null +++ b/lib/Maya2024/windows/dnacalib.py @@ -0,0 +1,1127 @@ +# This file was automatically generated by SWIG (https://www.swig.org). +# Version 4.1.1 +# +# Do not make changes to this file unless you know what you are doing - modify +# the SWIG interface file instead. + + +import os +if hasattr(os, 'add_dll_directory'): + for path in os.environ.get('PATH', '').split(';'): + try: + if path: + os.add_dll_directory(path) + except Exception: + pass + + + +from sys import version_info as _swig_python_version_info +# Import the low-level C/C++ module +if __package__ or "." in __name__: + from . import _py3dnacalib +else: + import _py3dnacalib + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_instance_variable(set): + def set_instance_attr(self, name, value): + if name == "this": + set(self, name, value) + elif name == "thisown": + self.this.own(value) + elif hasattr(self, name) and isinstance(getattr(type(self), name), property): + set(self, name, value) + else: + raise AttributeError("You cannot add instance attributes to %s" % self) + return set_instance_attr + + +def _swig_setattr_nondynamic_class_variable(set): + def set_class_attr(cls, name, value): + if hasattr(cls, name) and not isinstance(getattr(cls, name), property): + set(cls, name, value) + else: + raise AttributeError("You cannot add class attributes to %s" % cls) + return set_class_attr + + +def _swig_add_metaclass(metaclass): + """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass""" + def wrapper(cls): + return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy()) + return wrapper + + +class _SwigNonDynamicMeta(type): + """Meta class to enforce nondynamic attributes (no new attributes) for a class""" + __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) + + + +def with_metaclass(meta, *bases): + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + +import dna +class VersionInfo(object): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + + @staticmethod + def getMajorVersion(): + return _py3dnacalib.VersionInfo_getMajorVersion() + + @staticmethod + def getMinorVersion(): + return _py3dnacalib.VersionInfo_getMinorVersion() + + @staticmethod + def getPatchVersion(): + return _py3dnacalib.VersionInfo_getPatchVersion() + + @staticmethod + def getVersionString(): + return _py3dnacalib.VersionInfo_getVersionString() + + def __init__(self): + _py3dnacalib.VersionInfo_swiginit(self, _py3dnacalib.new_VersionInfo()) + __swig_destroy__ = _py3dnacalib.delete_VersionInfo + +# Register VersionInfo in _py3dnacalib: +_py3dnacalib.VersionInfo_swigregister(VersionInfo) +class DNACalibDNAReader(dna.Reader): + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + @staticmethod + def create(*args): + return _py3dnacalib.DNACalibDNAReader_create(*args) + + @staticmethod + def destroy(instance): + return _py3dnacalib.DNACalibDNAReader_destroy(instance) + +# Register DNACalibDNAReader in _py3dnacalib: +_py3dnacalib.DNACalibDNAReader_swigregister(DNACalibDNAReader) + +DNACalibDNAReaderImpl = DNACalibDNAReader + +class DNACalibDNAReaderImplReflectionMixin(type): + + def __getattr__(cls, name): + return getattr(DNACalibDNAReaderImpl, name) + + def __dir__(cls): + return [name for name in dir(DNACalibDNAReaderImpl) if name not in ("create","destroy")] + +class DNACalibDNAReader(with_metaclass(DNACalibDNAReaderImplReflectionMixin, object)): + __slots__ = ('_args', '_kwargs', '_instance') + + def __init__(self, *args, **kwargs): + self._args = args + self._kwargs = kwargs + self._instance = DNACalibDNAReaderImpl.create(*args, **kwargs) + + def __del__(self): + DNACalibDNAReaderImpl.destroy(self._instance) + + def _in_slots(self, attr): + for cls in type(self).__mro__: + if attr in getattr(cls, '__slots__', []): + return True + return False + + def __getattr__(self, attr): + if self._in_slots(attr): + return object.__getattr__(self, attr) + return getattr(self._instance, attr) + + def __setattr__(self, attr, value): + if self._in_slots(attr): + object.__setattr__(self, attr, value) + else: + setattr(self._instance, attr, value) + + def __dir__(self): + return [name for name in self._instance.__dir__() if name not in ("create","destroy")] + +class Command(object): + r""" Command is an abstract class whose implementations are expected to modify the DNA provided in the run() method in some way.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_Command + + def run(self, output): + return _py3dnacalib.Command_run(self, output) + +# Register Command in _py3dnacalib: +_py3dnacalib.Command_swigregister(Command) +VectorOperation_Interpolate = _py3dnacalib.VectorOperation_Interpolate +VectorOperation_Add = _py3dnacalib.VectorOperation_Add +VectorOperation_Subtract = _py3dnacalib.VectorOperation_Subtract +VectorOperation_Multiply = _py3dnacalib.VectorOperation_Multiply +class CommandSequence(Command): + r""" + CommandSequence is used to run a sequence of commands on the same DNA. + Notes: + Commands will be run in the order in which they were added to the sequence. + + CommandSequence holds pointers to commands, but does not own them. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_CommandSequence + + def __init__(self, *args): + _py3dnacalib.CommandSequence_swiginit(self, _py3dnacalib.new_CommandSequence(*args)) + + def run(self, output): + return _py3dnacalib.CommandSequence_run(self, output) + + def add(self, command): + r""" + Method for adding a command to a sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to add. + """ + return _py3dnacalib.CommandSequence_add(self, command) + + def remove(self, command): + r""" + Method for removing a command from the sequence of commands to run. + :type command: :py:class:`Command` + :param command: + The command to remove. + """ + return _py3dnacalib.CommandSequence_remove(self, command) + + def contains(self, command): + r""" + Method for checking if the provided command is part of the command sequence. + :type command: :py:class:`Command` + :param command: + The command to check. + """ + return _py3dnacalib.CommandSequence_contains(self, command) + + def size(self): + r""" Number of commands in command sequence.""" + return _py3dnacalib.CommandSequence_size(self) + +# Register CommandSequence in _py3dnacalib: +_py3dnacalib.CommandSequence_swigregister(CommandSequence) + +def command_sequence_init(_init): + def wrapper(self, *args, **kwargs): + self._commands = [] + _init(self, *args, **kwargs) + return wrapper + +def command_sequence_add(_add): + def wrapper(self, command): + self._commands.append(command) + _add(self, command) + return wrapper + +def command_sequence_remove(_remove): + def wrapper(self, command): + self._commands.remove(command) + _remove(self, command) + return wrapper + +CommandSequence.__init__ = command_sequence_init(CommandSequence.__init__) +CommandSequence.add = command_sequence_add(CommandSequence.add) +CommandSequence.remove = command_sequence_remove(CommandSequence.remove) + +class CalculateMeshLowerLODsCommand(Command): + r""" + CalculateMeshLowerLODsCommand is used to recalculate vertex positions for lower LOD meshes of the specified mesh. + Notes: + The calculation is done based on vertex positions of the specified mesh and vertex texture coordinates of its lower LOD meshes. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_CalculateMeshLowerLODsCommand + + def __init__(self, *args): + _py3dnacalib.CalculateMeshLowerLODsCommand_swiginit(self, _py3dnacalib.new_CalculateMeshLowerLODsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to calculate lower LOD meshes from. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ + return _py3dnacalib.CalculateMeshLowerLODsCommand_setMeshIndex(self, meshIndex) + + def run(self, output): + return _py3dnacalib.CalculateMeshLowerLODsCommand_run(self, output) + +# Register CalculateMeshLowerLODsCommand in _py3dnacalib: +_py3dnacalib.CalculateMeshLowerLODsCommand_swigregister(CalculateMeshLowerLODsCommand) +class ClearBlendShapesCommand(Command): + r""" + ClearBlendShapesCommand is used to clear all blend shapes data from a DNA. + Notes: This command clears blend shape target deltas and blend shape animation data. By doing so, it transforms the DNA to be "joints only". + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_ClearBlendShapesCommand + + def __init__(self, *args): + _py3dnacalib.ClearBlendShapesCommand_swiginit(self, _py3dnacalib.new_ClearBlendShapesCommand(*args)) + + def run(self, output): + return _py3dnacalib.ClearBlendShapesCommand_run(self, output) + +# Register ClearBlendShapesCommand in _py3dnacalib: +_py3dnacalib.ClearBlendShapesCommand_swigregister(ClearBlendShapesCommand) +class PruneBlendShapeTargetsCommand(Command): + r""" PruneBlendShapeTargetsCommand is used to prune blend shape target deltas whose absolute magnitude is less than or equal to the specified threshold.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_PruneBlendShapeTargetsCommand + + def __init__(self, *args): + _py3dnacalib.PruneBlendShapeTargetsCommand_swiginit(self, _py3dnacalib.new_PruneBlendShapeTargetsCommand(*args)) + + def setThreshold(self, threshold): + r""" + Method for setting the threshold for pruning blend shape target deltas. + :type threshold: float + :param threshold: + The threshold to use. + """ + return _py3dnacalib.PruneBlendShapeTargetsCommand_setThreshold(self, threshold) + + def run(self, output): + return _py3dnacalib.PruneBlendShapeTargetsCommand_run(self, output) + +# Register PruneBlendShapeTargetsCommand in _py3dnacalib: +_py3dnacalib.PruneBlendShapeTargetsCommand_swigregister(PruneBlendShapeTargetsCommand) +class RemoveAnimatedMapCommand(Command): + r""" RemoveAnimatedMapCommand is used to remove animated maps.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveAnimatedMapCommand + + def __init__(self, *args): + _py3dnacalib.RemoveAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RemoveAnimatedMapCommand(*args)) + + def setAnimatedMapIndex(self, animatedMapIndex): + r""" + Method for setting the index of the animated map to remove. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ + return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndex(self, animatedMapIndex) + + def setAnimatedMapIndices(self, animatedMapIndices): + r""" + Method for setting the indices of animated maps to remove. + :type animatedMapIndices: dnac::ConstArrayView< std::uint16_t > + :param animatedMapIndices: + The animated map indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set animated map(s) will be removed. + """ + return _py3dnacalib.RemoveAnimatedMapCommand_setAnimatedMapIndices(self, animatedMapIndices) + + def run(self, output): + return _py3dnacalib.RemoveAnimatedMapCommand_run(self, output) + +# Register RemoveAnimatedMapCommand in _py3dnacalib: +_py3dnacalib.RemoveAnimatedMapCommand_swigregister(RemoveAnimatedMapCommand) +class RemoveBlendShapeCommand(Command): + r""" RemoveBlendShapeCommand is used to remove blend shapes.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveBlendShapeCommand + + def __init__(self, *args): + _py3dnacalib.RemoveBlendShapeCommand_swiginit(self, _py3dnacalib.new_RemoveBlendShapeCommand(*args)) + + def setBlendShapeIndex(self, blendShapeIndex): + r""" + Method for setting the index of the blend shape to remove. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ + return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndex(self, blendShapeIndex) + + def setBlendShapeIndices(self, blendShapeIndices): + r""" + Method for setting the indices of blend shapes to remove. + :type blendShapeIndices: dnac::ConstArrayView< std::uint16_t > + :param blendShapeIndices: + The blend shape indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set blend shape(s) will be removed. + """ + return _py3dnacalib.RemoveBlendShapeCommand_setBlendShapeIndices(self, blendShapeIndices) + + def run(self, output): + return _py3dnacalib.RemoveBlendShapeCommand_run(self, output) + +# Register RemoveBlendShapeCommand in _py3dnacalib: +_py3dnacalib.RemoveBlendShapeCommand_swigregister(RemoveBlendShapeCommand) +class RemoveJointAnimationCommand(Command): + r""" RemoveJointAnimationCommand is used to remove joint animation data.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveJointAnimationCommand + + def __init__(self, *args): + _py3dnacalib.RemoveJointAnimationCommand_swiginit(self, _py3dnacalib.new_RemoveJointAnimationCommand(*args)) + + def setJointIndex(self, jointIndex): + r""" + Method for setting the index of a joint whose animation data to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ + return _py3dnacalib.RemoveJointAnimationCommand_setJointIndex(self, jointIndex) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints whose animation data to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint animation(s) will be removed. + """ + return _py3dnacalib.RemoveJointAnimationCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.RemoveJointAnimationCommand_run(self, output) + +# Register RemoveJointAnimationCommand in _py3dnacalib: +_py3dnacalib.RemoveJointAnimationCommand_swigregister(RemoveJointAnimationCommand) +class RemoveJointCommand(Command): + r""" RemoveJointCommand is used to remove joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveJointCommand + + def __init__(self, *args): + _py3dnacalib.RemoveJointCommand_swiginit(self, _py3dnacalib.new_RemoveJointCommand(*args)) + + def setJointIndex(self, jointIndex): + r""" + Method for setting the index of the joint to remove. + :type jointIndex: int + :param jointIndex: + The index of the joint. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ + return _py3dnacalib.RemoveJointCommand_setJointIndex(self, jointIndex) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the indices of joints to remove. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + The joint indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set joint(s) will be removed. + """ + return _py3dnacalib.RemoveJointCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.RemoveJointCommand_run(self, output) + +# Register RemoveJointCommand in _py3dnacalib: +_py3dnacalib.RemoveJointCommand_swigregister(RemoveJointCommand) +class RemoveMeshCommand(Command): + r""" RemoveMeshCommand is used to remove meshes.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RemoveMeshCommand + + def __init__(self, *args): + _py3dnacalib.RemoveMeshCommand_swiginit(self, _py3dnacalib.new_RemoveMeshCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to remove. + :type meshIndex: int + :param meshIndex: + The index of the mesh. + """ + return _py3dnacalib.RemoveMeshCommand_setMeshIndex(self, meshIndex) + + def setMeshIndices(self, meshIndices): + r""" + Method for setting the indices of meshes to remove. + :type meshIndices: dnac::ConstArrayView< std::uint16_t > + :param meshIndices: + The mesh indices. + Notes: Call to either setter overwrites previous setter calls. When running the command, the last set mesh(es) will be removed. + """ + return _py3dnacalib.RemoveMeshCommand_setMeshIndices(self, meshIndices) + + def run(self, output): + return _py3dnacalib.RemoveMeshCommand_run(self, output) + +# Register RemoveMeshCommand in _py3dnacalib: +_py3dnacalib.RemoveMeshCommand_swigregister(RemoveMeshCommand) +class RenameAnimatedMapCommand(Command): + r""" RenameAnimatedMapCommand is used to rename an animated map.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameAnimatedMapCommand + + def __init__(self, *args): + _py3dnacalib.RenameAnimatedMapCommand_swiginit(self, _py3dnacalib.new_RenameAnimatedMapCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for animated map with given index. + :type animatedMapIndex: int + :param animatedMapIndex: + The index of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + + | + + *Overload 2:* + + Method for setting a new name for animated map with given name. + Notes: + The renaming will not happen if there is no animated map with given current name. + :type oldName: string + :param oldName: + The current name of the animated map whose name to change. + :type newName: string + :param newName: + The new name for the animated map. + """ + return _py3dnacalib.RenameAnimatedMapCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameAnimatedMapCommand_run(self, output) + +# Register RenameAnimatedMapCommand in _py3dnacalib: +_py3dnacalib.RenameAnimatedMapCommand_swigregister(RenameAnimatedMapCommand) +class RenameBlendShapeCommand(Command): + r""" RenameBlendShapeCommand is used to rename a blend shape channel.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameBlendShapeCommand + + def __init__(self, *args): + _py3dnacalib.RenameBlendShapeCommand_swiginit(self, _py3dnacalib.new_RenameBlendShapeCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for blend shape channel with given index. + :type blendShapeIndex: int + :param blendShapeIndex: + The index of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + + | + + *Overload 2:* + + Method for setting a new name for blend shape channel with given name. + Notes: + The renaming will not happen if there is no blend shape channel with given current name. + :type oldName: string + :param oldName: + The current name of the blend shape channel whose name to change. + :type newName: string + :param newName: + The new name for the blend shape channel. + """ + return _py3dnacalib.RenameBlendShapeCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameBlendShapeCommand_run(self, output) + +# Register RenameBlendShapeCommand in _py3dnacalib: +_py3dnacalib.RenameBlendShapeCommand_swigregister(RenameBlendShapeCommand) +class RenameJointCommand(Command): + r""" RenameJointCommand is used to rename a joint.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameJointCommand + + def __init__(self, *args): + _py3dnacalib.RenameJointCommand_swiginit(self, _py3dnacalib.new_RenameJointCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for joint with given index. + :type jointIndex: int + :param jointIndex: + The index of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + + | + + *Overload 2:* + + Method for setting a new name for joint with given name. + Notes: + The renaming will not happen if there is no joint with given current name. + :type oldName: string + :param oldName: + The current name of the joint whose name to change. + :type newName: string + :param newName: + The new name for the joint. + """ + return _py3dnacalib.RenameJointCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameJointCommand_run(self, output) + +# Register RenameJointCommand in _py3dnacalib: +_py3dnacalib.RenameJointCommand_swigregister(RenameJointCommand) +class RenameMeshCommand(Command): + r""" RenameMeshCommand is used to rename a mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RenameMeshCommand + + def __init__(self, *args): + _py3dnacalib.RenameMeshCommand_swiginit(self, _py3dnacalib.new_RenameMeshCommand(*args)) + + def setName(self, *args): + r""" + *Overload 1:* + + Method for setting a new name for mesh with given index. + :type meshIndex: int + :param meshIndex: + The index of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + + | + + *Overload 2:* + + Method for setting a new name for mesh with given name. + Notes: + The renaming will not happen if there is no mesh with given current name. + :type oldName: string + :param oldName: + The current name of the mesh whose name to change. + :type newName: string + :param newName: + The new name for the mesh. + """ + return _py3dnacalib.RenameMeshCommand_setName(self, *args) + + def run(self, output): + return _py3dnacalib.RenameMeshCommand_run(self, output) + +# Register RenameMeshCommand in _py3dnacalib: +_py3dnacalib.RenameMeshCommand_swigregister(RenameMeshCommand) +class RotateCommand(Command): + r""" + RotateCommand is used to rotate neutral joints and vertex positions around given origin. + Notes: + Joint rotations are represented in parent space, so it is enough to rotate only root joints, as that rotation will be propagated to the rest of the joints. + + If the origin is not set, the assumed origin is (0, 0, 0). + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_RotateCommand + + def __init__(self, *args): + _py3dnacalib.RotateCommand_swiginit(self, _py3dnacalib.new_RotateCommand(*args)) + + def setRotation(self, degrees): + r""" + Method for setting the rotation angles. + :type degrees: dnac::Vector3 + :param degrees: + Rotation angles in degrees. + """ + return _py3dnacalib.RotateCommand_setRotation(self, degrees) + + def setOrigin(self, origin): + r""" + Method for setting the rotation origin. + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ + return _py3dnacalib.RotateCommand_setOrigin(self, origin) + + def run(self, output): + return _py3dnacalib.RotateCommand_run(self, output) + +# Register RotateCommand in _py3dnacalib: +_py3dnacalib.RotateCommand_swigregister(RotateCommand) +class ScaleCommand(Command): + r""" + ScaleCommand is used to scale neutral joints, vertex positions and joint and blendshape deltas by a factor. + Notes: + Only translation attributes of neutral joints and joint deltas are scaled. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_ScaleCommand + + def __init__(self, *args): + _py3dnacalib.ScaleCommand_swiginit(self, _py3dnacalib.new_ScaleCommand(*args)) + + def setScale(self, scale): + r""" + Method for setting the scale factor to multiply with. + :type scale: float + :param scale: + Scale factor. + """ + return _py3dnacalib.ScaleCommand_setScale(self, scale) + + def setOrigin(self, origin): + r""" + Method for setting the origin. + Notes: The origin is used to properly scale position values (vertex positions and neutral joint translations). + :type origin: dnac::Vector3 + :param origin: + Origin coordinates. + """ + return _py3dnacalib.ScaleCommand_setOrigin(self, origin) + + def run(self, output): + return _py3dnacalib.ScaleCommand_run(self, output) + +# Register ScaleCommand in _py3dnacalib: +_py3dnacalib.ScaleCommand_swigregister(ScaleCommand) +class SetBlendShapeTargetDeltasCommand(Command): + r""" SetBlendShapeTargetDeltasCommand is used to change blend shape target deltas.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetBlendShapeTargetDeltasCommand + + def __init__(self, *args): + _py3dnacalib.SetBlendShapeTargetDeltasCommand_swiginit(self, _py3dnacalib.new_SetBlendShapeTargetDeltasCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh whose blend shape target to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMeshIndex(self, meshIndex) + + def setBlendShapeTargetIndex(self, blendShapeTargetIndex): + r""" + Method for setting the index of the blend shape target to change. + :type blendShapeTargetIndex: int + :param blendShapeTargetIndex: + The blend shape target index. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setBlendShapeTargetIndex(self, blendShapeTargetIndex) + + def setDeltas(self, *args): + r""" + *Overload 1:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type deltas: dnac::ConstArrayView< dnac::Vector3 > + :param deltas: + The values used in calculation. + + | + + *Overload 2:* + + Method for setting the values used to calculate new deltas for blend shape target. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X values for each delta. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y values for each delta. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z values for each delta. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setDeltas(self, *args) + + def setVertexIndices(self, vertexIndices): + r""" + Method for setting the vertex indices that correspond to new deltas. + :type vertexIndices: dnac::ConstArrayView< std::uint32_t > + :param vertexIndices: + The vertexIndices. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setVertexIndices(self, vertexIndices) + + def setMasks(self, masks): + r""" + Method for setting masks used to calculate new deltas for blend shape target. + Notes: + If no masks are set, default weight value of 1 is used for each delta. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each delta. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setMasks(self, masks) + + def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new deltas for blend shape target. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each delta is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new deltas that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_setOperation(self, operation) + + def run(self, output): + return _py3dnacalib.SetBlendShapeTargetDeltasCommand_run(self, output) + +# Register SetBlendShapeTargetDeltasCommand in _py3dnacalib: +_py3dnacalib.SetBlendShapeTargetDeltasCommand_swigregister(SetBlendShapeTargetDeltasCommand) +cvar = _py3dnacalib.cvar +SetBlendShapeTargetDeltasCommand.VertexIndicesOutOfBoundsError = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_VertexIndicesOutOfBoundsError +SetBlendShapeTargetDeltasCommand.NoVertexIndicesSetError = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_NoVertexIndicesSetError +SetBlendShapeTargetDeltasCommand.DeltasVertexIndicesCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasVertexIndicesCountMismatch +SetBlendShapeTargetDeltasCommand.DeltasMasksCountMismatch = _py3dnacalib.cvar.SetBlendShapeTargetDeltasCommand_DeltasMasksCountMismatch + +class SetLODsCommand(Command): + r""" SetLODsCommand is used to specify LODs to use. Joints, blend shapes, animated maps and meshes that are not in specified LODs are removed from the DNA.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetLODsCommand + + def __init__(self, *args): + _py3dnacalib.SetLODsCommand_swiginit(self, _py3dnacalib.new_SetLODsCommand(*args)) + + def setLODs(self, lods): + r""" + Method for setting the LODs to keep. + :type lods: dnac::ConstArrayView< std::uint16_t > + :param lods: + New LODs to be used. + """ + return _py3dnacalib.SetLODsCommand_setLODs(self, lods) + + def run(self, output): + return _py3dnacalib.SetLODsCommand_run(self, output) + +# Register SetLODsCommand in _py3dnacalib: +_py3dnacalib.SetLODsCommand_swigregister(SetLODsCommand) +class SetNeutralJointRotationsCommand(Command): + r""" SetNeutralJointRotationsCommand is used to set new rotation values to neutral joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointRotationsCommand + + def __init__(self, *args): + _py3dnacalib.SetNeutralJointRotationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointRotationsCommand(*args)) + + def setRotations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint rotations. + :type rotations: dnac::ConstArrayView< dnac::Vector3 > + :param rotations: + Rotation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint rotations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X rotation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y rotation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z rotation value for each joint. + """ + return _py3dnacalib.SetNeutralJointRotationsCommand_setRotations(self, *args) + + def run(self, output): + return _py3dnacalib.SetNeutralJointRotationsCommand_run(self, output) + +# Register SetNeutralJointRotationsCommand in _py3dnacalib: +_py3dnacalib.SetNeutralJointRotationsCommand_swigregister(SetNeutralJointRotationsCommand) +class SetNeutralJointTranslationsCommand(Command): + r""" SetNeutralJointTranslationsCommand is used to set new translation values to neutral joints.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetNeutralJointTranslationsCommand + + def __init__(self, *args): + _py3dnacalib.SetNeutralJointTranslationsCommand_swiginit(self, _py3dnacalib.new_SetNeutralJointTranslationsCommand(*args)) + + def setTranslations(self, *args): + r""" + *Overload 1:* + + Method for setting the neutral joint translations. + :type translations: dnac::ConstArrayView< dnac::Vector3 > + :param translations: + Translation values for each joint. + + | + + *Overload 2:* + + Method for setting the neutral joint translations. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X translation value for each joint. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y translation value for each joint. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z translation value for each joint. + """ + return _py3dnacalib.SetNeutralJointTranslationsCommand_setTranslations(self, *args) + + def run(self, output): + return _py3dnacalib.SetNeutralJointTranslationsCommand_run(self, output) + +# Register SetNeutralJointTranslationsCommand in _py3dnacalib: +_py3dnacalib.SetNeutralJointTranslationsCommand_swigregister(SetNeutralJointTranslationsCommand) +class SetSkinWeightsCommand(Command): + r""" SetSkinWeightsCommand is used to set new skin weights for a vertex in a mesh.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetSkinWeightsCommand + + def __init__(self, *args): + _py3dnacalib.SetSkinWeightsCommand_swiginit(self, _py3dnacalib.new_SetSkinWeightsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the targeted mesh. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetSkinWeightsCommand_setMeshIndex(self, meshIndex) + + def setVertexIndex(self, vertexIndex): + r""" + Method for setting the index of the vertex to change. + :type vertexIndex: int + :param vertexIndex: + The vertex index. + """ + return _py3dnacalib.SetSkinWeightsCommand_setVertexIndex(self, vertexIndex) + + def setWeights(self, weights): + r""" + Method for setting the weights with which joints influence the vertex in question. + :type weights: dnac::ConstArrayView< float > + :param weights: + Weights for each joint that has an influence on the vertex. + """ + return _py3dnacalib.SetSkinWeightsCommand_setWeights(self, weights) + + def setJointIndices(self, jointIndices): + r""" + Method for setting the joint indices of joints that influence the vertex in question. + :type jointIndices: dnac::ConstArrayView< std::uint16_t > + :param jointIndices: + Joint indices of joints that have an influence on the vertex. + """ + return _py3dnacalib.SetSkinWeightsCommand_setJointIndices(self, jointIndices) + + def run(self, output): + return _py3dnacalib.SetSkinWeightsCommand_run(self, output) + +# Register SetSkinWeightsCommand in _py3dnacalib: +_py3dnacalib.SetSkinWeightsCommand_swigregister(SetSkinWeightsCommand) +class SetVertexPositionsCommand(Command): + r""" SetVertexPositionsCommand is used to change vertex positions values.""" + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_SetVertexPositionsCommand + + def __init__(self, *args): + _py3dnacalib.SetVertexPositionsCommand_swiginit(self, _py3dnacalib.new_SetVertexPositionsCommand(*args)) + + def setMeshIndex(self, meshIndex): + r""" + Method for setting the index of the mesh to change. + :type meshIndex: int + :param meshIndex: + The mesh index. + """ + return _py3dnacalib.SetVertexPositionsCommand_setMeshIndex(self, meshIndex) + + def setPositions(self, *args): + r""" + *Overload 1:* + + Method for setting the vertex positions used to calculate new values. + :type positions: dnac::ConstArrayView< dnac::Vector3 > + :param positions: + The vertex positions. + + | + + *Overload 2:* + + Method for setting the vertex positions used to calculate new values. + :type xs: dnac::ConstArrayView< float > + :param xs: + The X coordinates for each vertex. + :type ys: dnac::ConstArrayView< float > + :param ys: + The Y coordinates for each vertex. + :type zs: dnac::ConstArrayView< float > + :param zs: + The Z coordinates for each vertex. + """ + return _py3dnacalib.SetVertexPositionsCommand_setPositions(self, *args) + + def setMasks(self, masks): + r""" + Method for setting vertex masks used to calculate new vertex position values. + Notes: + If no masks are set, default weight value of 1 is used for each vertex. + :type masks: dnac::ConstArrayView< float > + :param masks: + The weights for each vertex. + """ + return _py3dnacalib.SetVertexPositionsCommand_setMasks(self, masks) + + def setOperation(self, operation): + r""" + Method for setting the type of operation used to calculate new vertex position values. + Notes: + Available operations are: Interpolate, Add, Subtract and Multiply. Each position is calculated based on the provided operation type in the following way: + + Interpolate: = previousValue * (1 - weight) + setValue * weight:math:`\n Add: \f$newValue = previousValue + (setValue * weight)` + + Subtract: = previousValue - (setValue * weight):math:`\n Multiply: \f$newValue = previousValue * (setValue * weight)` + + + setValue is the value from new positions that were set, and weight is the value from masks array. + :type operation: int + :param operation: + The operation to use. + """ + return _py3dnacalib.SetVertexPositionsCommand_setOperation(self, operation) + + def run(self, output): + return _py3dnacalib.SetVertexPositionsCommand_run(self, output) + +# Register SetVertexPositionsCommand in _py3dnacalib: +_py3dnacalib.SetVertexPositionsCommand_swigregister(SetVertexPositionsCommand) +SetVertexPositionsCommand.PositionsMasksCountMismatch = _py3dnacalib.cvar.SetVertexPositionsCommand_PositionsMasksCountMismatch + +class TranslateCommand(Command): + r""" + TranslateCommand is used to translate neutral joints and vertex positions. + Notes: + Joint translations are represented in parent space, so it is enough to translate only root joints, as that translation will be propagated to the rest of the joints. + """ + + thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") + __repr__ = _swig_repr + __swig_destroy__ = _py3dnacalib.delete_TranslateCommand + + def __init__(self, *args): + _py3dnacalib.TranslateCommand_swiginit(self, _py3dnacalib.new_TranslateCommand(*args)) + + def setTranslation(self, translation): + r""" + Method for setting the translation vector. + :type translation: dnac::Vector3 + :param translation: + The translation vector. + """ + return _py3dnacalib.TranslateCommand_setTranslation(self, translation) + + def run(self, output): + return _py3dnacalib.TranslateCommand_run(self, output) + +# Register TranslateCommand in _py3dnacalib: +_py3dnacalib.TranslateCommand_swigregister(TranslateCommand) + diff --git a/lib/Maya2024/windows/embeddedRL4.mll b/lib/Maya2024/windows/embeddedRL4.mll new file mode 100644 index 00000000..9e1c8490 Binary files /dev/null and b/lib/Maya2024/windows/embeddedRL4.mll differ