Author Topic: C8 - VFB tonemapping parameters have been hidden from Maxscripting?  (Read 5050 times)

2022-05-25, 01:21:41

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
Hi

For years I've been using a render pass manager called Vexus.

Upon update to Corona 8 - the Frame buffer parameters are no longer being passed from Vexus to the VFB.

I was just talking to the developer who was keen to see if he can update his software to support C8, but it appears that these parameters are no longer available?

Have they been renamed?

Thanks

Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3

2022-05-25, 16:16:33
Reply #1

Frood

  • Active Users
  • **
  • Posts: 1903
    • View Profile
    • Rakete GmbH
Have they been renamed?

Not just renamed. The new, more flexible tone mapping pipeline is a completely different approach. Of course this is reflected in script access as well.

There is no documentation currently, but the key to open the script door to the post processing settings is "renderers.current.colorMap_pipeline"

As an example, this one iterates through the pipeline and lists all operators with their properties:

Code: [Select]
op=renderers.current.colorMap_pipeline
while op!=undefined do (
Print ("Operator found: " + classof op as string)
show op
op=op.colorMappingOperator_nextOperator
)


Everything else can be quite easily guessed by inspecting the objects.


Good Luck



Never underestimate the power of a well placed level one spell.

2022-05-26, 00:01:15
Reply #2

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
Thanks I've passed that on.
Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3

2022-06-07, 01:02:21
Reply #3

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
Would anyone mind posting a couple of examples of how I might edit these parameters via maxscript?

I can figure out which I need to edit but I'm not a scripter.
Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3

2022-06-07, 11:34:05
Reply #4

maru

  • Corona Team
  • Active Users
  • ****
  • Posts: 12708
  • Marcin
    • View Profile
Sharing some info from a related support case:

When you call showProperties renderers.current, you will notice that there is a renderers.current.colorMap_pipeline property, which is of type MaxObject.

Also calling classOf (getProperty renderers.current "colorMap_pipeline") returns UndefinedClass.

While the old tone mapping had a fixed set of parameters that could be accessed directly like using the provided script, the new tone mapping works as follows - the main paramblock (renderers.current) holds the last tone mapping operator as getProperty renderers.current "colorMap.pipeline" and each operator holds the next operator (in the UI it's the one above) like getProperty (getProperty renderers.current "colorMap.pipeline") "colorMappingOperator.nextOperator" - from these, we can get particular parameter values as getProperty (getProperty renderers.current "colorMap.pipeline") "colorMappingOperator.opacity"

The UndefinedClass is because the pipeline is saved only once a parameter is changed (we wanted to avoid having changes in the scene without any "real" user changes, but it can be a bit problematic), after changing the parameter, the command posted above returns correctly AcesOtOperatorPlugin - ! the legacy scenes have the pipeline right after opening, since there is the conversion of legacy parameters, so the command works without any additional changes of parameters

Here is the paramblock with the parameter names and types, it should be everything that is necessary to set the parameters from MAXScript:

Main paramblock (renderers.current):

T_BOOL, PARAM_COLORMAP_ENABLED, "colorMap.enabled", true
T_FLOAT, PARAM_COLORMAP_GAMMA, "colorMap.gamma", 2.2f, 0.1f, 10.f
T_STR, PARAM_COLORMAP_PIPELINE, "colorMap.pipeline", L""

Operator paramblocks:

ACES

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_ACES_OT_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_ACES_OT_OP_OPACITY, TYPE_FLOAT, _T("colorMappingOperator.opacity"),


CONTRAST

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_CONTRAST_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_CONTRAST_OP_CONTRAST, TYPE_FLOAT, _T("colorMappingOperator.contrast"),


CURVES

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_CURVES_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_CURVES_OP_MASTER_NODES, TYPE_POINT3_TAB, _T("colorMappingOperator.master.nodes"),
PARAM_CURVES_OP_MASTER_INTERPOL, TYPE_INT, _T("colorMappingOperator.master.interpol"),
PARAM_CURVES_OP_RED_NODES, TYPE_POINT3_TAB, _T("colorMappingOperator.r.nodes"),
PARAM_CURVES_OP_RED_INTERPOL, TYPE_INT, _T("colorMappingOperator.r.interpol"),
PARAM_CURVES_OP_GREEN_NODES, TYPE_POINT3_TAB, _T("colorMappingOperator.g.nodes"),
PARAM_CURVES_OP_GREEN_INTERPOL, TYPE_INT, _T("colorMappingOperator.g.interpol"),
PARAM_CURVES_OP_BLUE_NODES, TYPE_POINT3_TAB, _T("colorMappingOperator.b.nodes"),
PARAM_CURVES_OP_BLUE_INTERPOL, TYPE_INT, _T("colorMappingOperator.b.interpol"),


FILMIC

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_FILMIC_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_FILMIC_OP_HIGHLIGHTS_COMPRESSION, TYPE_FLOAT, _T("colorMappingOperator.highlightCompression"),
PARAM_FILMIC_OP_RICH_SHADOWS, TYPE_FLOAT, _T("colorMappingOperator.richShadows"),


ADV FILMIC

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_FILMIC_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_ADVANCED_FILMIC_OP_TOE_STRENGTH, TYPE_FLOAT, _T("colorMappingOperator.toeStrength"),
PARAM_ADVANCED_FILMIC_OP_TOE_LENGTH, TYPE_FLOAT, _T("colorMappingOperator.toeLength"),
PARAM_ADVANCED_FILMIC_OP_SHOULDER_STRENGTH, TYPE_FLOAT, _T("colorMappingOperator.shoulderStrength"),
PARAM_ADVANCED_FILMIC_OP_SHOULDER_LENGTH, TYPE_FLOAT, _T("colorMappingOperator.shoulderLength"),
PARAM_ADVANCED_FILMIC_OP_SHOULDER_ANGLE, TYPE_FLOAT, _T("colorMappingOperator.shoulderAngle"),


GM TINT

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_GMTINT_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_GMTINT_OP_GREEN_MAGENTA_TINT, TYPE_FLOAT, _T("colorMappingOperator.greenMagentaTint"),


LUT

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_LUT_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_LUT_OP_PATH, TYPE_FILENAME, _T("colorMappingOperator.path"),
PARAM_LUT_OP_OPACITY, TYPE_FLOAT, _T("colorMappingOperator.opacity"),
PARAM_LUT_OP_LOGARITHMIC, TYPE_BOOL, _T("colorMappingOperator.logarithmic"),


PHOTOGRAPHIC EXPOSURE

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_EXPOSURE_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),


REINHARD

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_REINHARD_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_REINHARD_OP_HIGHLIGHT_COMPRESSION, TYPE_FLOAT, _T("colorMappingOperator.highlightCompression"),


SATURATION

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_SATURATION_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_SATURATION_OP_SATURATION, TYPE_FLOAT, _T("colorMappingOperator.saturation"),


SIMPLE EXPOSURE

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_EXPOSURE_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_EXPOSURE_OP_SIMPLE_EXPOSURE, TYPE_FLOAT,_T("colorMappingOperator.simpleExposure"),


TINT

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_TINT_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_TINT_OP_TINT, TYPE_RGBA, _T("colorMappingOperator.tint"),


TONE CURVE

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_TONE_CURVE_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_TONE_CURVE_OP_HIGHLIGHTS, TYPE_FLOAT, _T("colorMappingOperator.highlights"),
PARAM_TONE_CURVE_OP_LIGHTS, TYPE_FLOAT, _T("colorMappingOperator.lights"),
PARAM_TONE_CURVE_OP_DARKS, TYPE_FLOAT, _T("colorMappingOperator.darks"),
PARAM_TONE_CURVE_OP_SHADOWS, TYPE_FLOAT, _T("colorMappingOperator.shadows"),


VIGNETTE

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_VIGNETTE_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_VIGNETTE_OP_INTENSITY, TYPE_FLOAT, _T("colorMappingOperator.intensity"),
PARAM_VIGNETTE_OP_FALLOFF, TYPE_FLOAT, _T("colorMappingOperator.falloff"),


WHITE BALANCE

PARAM_COLOR_MAP_PREDECESSOR, TYPE_REFTARG, _T("colorMappingOperator.nextOperator"),
PARAM_WHITE_BALANCE_OP_ENABLED, TYPE_BOOL, _T("colorMappingOperator.enabled"),
PARAM_WHITE_BALANCE_OP_COLOR_TEMPERATURE, TYPE_FLOAT, _T("colorMappingOperator.colorTemperature"),

Update: In Corona 8 non-hotfix:
The tone mapping stack cannot be created from scratch using maxscript, or controlled using maxscript, unless you perform some manual intervention from the user interface first (e.g. create some new operators, change their values by hand). For example, if you create a fresh new scene and it already has some existing tone mapping stack, you will not be able to adjust its values using maxscript unless you change some of the values manually first. There are some technical reasons for this, and we did not predict that it could cause some issues to our users.

In Corona 8 Hotfix 1 and newer this part no longer applies and it should work fine out of the box.



- Adding operators: here is a basic example how to add two Contrast operators (currently, there is a limitation that the operators need to have a unique ID assigned manually, you'll see in the code)
op = ContrastOperatorPlugin()
setProperty op "colorMappingOperator.id" 1
setProperty renderers.current "colorMap.pipeline" op
op2 = ContrastOperatorPlugin()
setProperty op "colorMappingOperator.nextOperator" op2
setProperty renderers.current "colorMap.pipeline" op

The operators' names are

ContrastOperatorPlugin
CurvesOperatorPlugin
SimpleExposureOperatorPlugin
PhotographicExposureOperatorPlugin
FilmicOperatorPlugin
AdvancedFilmicOperatorPlugin
GreenMagentaTintOperatorPlugin
LutOperatorPlugin
ReinhardOperatorPlugin
SaturationOperatorPlugin
TintOperatorPlugin
ToneCurveOperatorPlugin
VignetteOperatorPlugin
WhiteBalanceOperatorPlugin
AcesOtOperatorPlugin

- Settings some preset and saving old values: in the script, you can store the old pipeline like getProperty renderers.current "colorMap.pipeline" and set it back after you are finished

This could be used to create the pipeline with the parameters assigned to the operators, so you don't have to index to the pipeline later.

---

In the latest V9 daily build (and this will be also a part of the V8 hotfix) we have included a fix to the "you need to create tone mapping manually or make some manual change in order for scripts to work":
Quote
Tone mapping pipeline is now created in every scene, without need to interact with it first, allowing users to access it from MAXScript
Link: https://forum.corona-renderer.com/index.php?topic=36810.0

---

Feel free to ask some further questions, however I would definitely need to get in touch with our developers, so getting an answer may take time. :)
We should also update our maxscript documentation at https://wiki.corona-renderer.com/maxscript at some point.



« Last Edit: 2022-06-28, 12:55:49 by maru »
Marcin Miodek | chaos-corona.com
3D Support Team Lead - Corona | contact us

2022-06-07, 13:06:15
Reply #5

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
!
Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3

2022-06-13, 18:29:24
Reply #6

JokerMartini

  • Active Users
  • **
  • Posts: 5
    • View Profile
Regarding the posts above, I'm one of the developers of Vexus and i had a question about adding new Operators.

Let's say for example, I wanted to append an operator from an arbitrary maxscript. how would one do so? Your sample script here works great but you redefine all the operators. I want to add a new one, leaving the existing ones as they are.

Is there a wrapper method or ease of use method that returns me the last operator so i can then call

```
op2 = ContrastOperatorPlugin()
setProperty lastOp "colorMappingOperator.nextOperator" op2
```

2022-06-13, 18:38:45
Reply #7

JokerMartini

  • Active Users
  • **
  • Posts: 5
    • View Profile
What method can be used to clear the all operators?

2022-06-13, 18:51:48
Reply #8

JokerMartini

  • Active Users
  • **
  • Posts: 5
    • View Profile
Here is my code. I'm trying to append new operators but i'm quite confused on how this is suppose to work. It seems to append them in the wrong order compared to when a user clicks the Plus (+) button within in the VFB. Help is much appreciated.

Code: [Select]
clearlistener()
fn clearOperators =
(
print "todo..."
)

fn getOperators =
(
local ops = #()
local op = renderers.current.colorMap_pipeline
while op != undefined do (
append ops op
--Print ("Operator found: " + classof op as string)
--show op
op = op.colorMappingOperator_nextOperator
)
ops
)

fn appendNewOperator op =
(
local ops = getOperators()
if ops.count == 0 then
(
setProperty renderers.current "colorMap.pipeline" op
) else
(
local lastOp = ops[ops.count]
setProperty lastOp "colorMappingOperator.nextOperator" op
)
)

-- clearOperators()
-- op = getOperators()

appendNewOperator (LutOperatorPlugin())
appendNewOperator (AcesOtOperatorPlugin())
appendNewOperator (ReinhardOperatorPlugin())
appendNewOperator (ToneCurveOperatorPlugin())
appendNewOperator (ContrastOperatorPlugin())


2022-06-14, 09:11:23
Reply #9

rowmanns

  • Corona Team
  • Active Users
  • ****
  • Posts: 1892
  • Corona for 3ds Max QA Team
    • View Profile

2022-06-14, 13:40:17
Reply #10

JokerMartini

  • Active Users
  • **
  • Posts: 5
    • View Profile
Yeah i checked out the docs. those were a good starting point. However i've diving a bit deeper into the code and trying to build a pipeline. It seems like there are quite a few things unclear or broke, i could use your help with.

1. When adding a new operator via, it seems that the checkbox does not work. Run the following code and try to click the checkbox on all the operators.

Code: [Select]
clearlistener()
fn clearOperators =
(
renderers.current.colorMap_pipeline = undefined
)

fn getOperators =
(
local ops = #()
local op = renderers.current.colorMap_pipeline
while op != undefined do (
append ops op
--Print ("Operator found: " + classof op as string)
--show op
op = op.colorMappingOperator_nextOperator
)
ops
)

fn appendNewOperator op =
(
local ops = getOperators()
if ops.count == 0 then
(
setProperty renderers.current "colorMap.pipeline" op
) else
(
local lastOp = ops[ops.count]
setProperty lastOp "colorMappingOperator.nextOperator" op
)
)
clearOperators()
appendNewOperator (AcesOtOperatorPlugin())
appendNewOperator (ContrastOperatorPlugin())
appendNewOperator (LutOperatorPlugin())
appendNewOperator (ReinhardOperatorPlugin())
appendNewOperator (ToneCurveOperatorPlugin())

2. When adding an operator through code, it always appends it to the bottom even when adding it to the last operator by called 'setProperty lastOp ....' as shown in the docs. However when you click the + button in the UI it adds the operator at the bottom of the list. It seems unclear on how to do that same process via code succesfully.

I want to be able to build a new operator without necessarily always clearing ones that already exist.

2022-06-15, 09:09:48
Reply #11

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
As a temporary workaround, would anyone mind posting the maxscript for loading tonemapping settings that have already been saved out from the framebuffer?

Then I can manually save out the xml, and then I can hopefully use Vexus to handle loading the relevant one per pass. It's a real pain to update 8-10 or so parameters manually per pass without making any mistakes.

And the uninstaller is broke too so I have been stuck with Corona 8.
Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3

2022-06-15, 10:11:19
Reply #12

Aram Avetisyan

  • Corona Team
  • Active Users
  • ****
  • Posts: 543
    • View Profile
Yeah i checked out the docs. those were a good starting point. However i've diving a bit deeper into the code and trying to build a pipeline. It seems like there are quite a few things unclear or broke, i could use your help with.

1. When adding a new operator via, it seems that the checkbox does not work. Run the following code and try to click the checkbox on all the operators.

Code: [Select]
clearlistener()
fn clearOperators =
(
renderers.current.colorMap_pipeline = undefined
)

fn getOperators =
(
local ops = #()
local op = renderers.current.colorMap_pipeline
while op != undefined do (
append ops op
--Print ("Operator found: " + classof op as string)
--show op
op = op.colorMappingOperator_nextOperator
)
ops
)

fn appendNewOperator op =
(
local ops = getOperators()
if ops.count == 0 then
(
setProperty renderers.current "colorMap.pipeline" op
) else
(
local lastOp = ops[ops.count]
setProperty lastOp "colorMappingOperator.nextOperator" op
)
)
clearOperators()
appendNewOperator (AcesOtOperatorPlugin())
appendNewOperator (ContrastOperatorPlugin())
appendNewOperator (LutOperatorPlugin())
appendNewOperator (ReinhardOperatorPlugin())
appendNewOperator (ToneCurveOperatorPlugin())

2. When adding an operator through code, it always appends it to the bottom even when adding it to the last operator by called 'setProperty lastOp ....' as shown in the docs. However when you click the + button in the UI it adds the operator at the bottom of the list. It seems unclear on how to do that same process via code succesfully.

I want to be able to build a new operator without necessarily always clearing ones that already exist.

Hi,

You are missing the id setting part. We will stress this clearly in the documentation.
Please see if this version works for you.

Thanks,
Aram
Aram Avetisyan | chaos-corona.com
Chaos Corona Support Representative | contact us

2022-06-15, 11:49:10
Reply #13

bohus.brecka

  • Corona Team
  • Users
  • ****
  • Posts: 4
    • View Profile
Hello,

regarding the adding of operator at the end - this is the correct way

Code: [Select]
newOp = ContrastOperatorPlugin()
setProperty newOp "colorMappingOperator.id" 1
lastOperator = getProperty renderers.current "colorMap.pipeline"
setProperty newOp "colorMappingOperator.nextOperator" lastOperator
setProperty renderers.current "colorMap.pipeline" newOp

The important thing is - the operator returned by "colorMap.pipeline" is the operator at the bottom in the UI. The operator in "colorMappingOperator.nextOperator" is the one above.

Hope this helps, we will update the wiki.

Bohus

2022-06-16, 01:28:02
Reply #14

DPS

  • Active Users
  • **
  • Posts: 118
    • View Profile
I have this code that seems to change the paramters that I want:

Code: [Select]
op = LutOperatorPlugin()
setProperty op "colorMappingOperator.id" 1
setProperty op "colorMappingOperator.enabled" false
setProperty op "colorMappingOperator.path" "L:\_Max_stuff\_Corona_LUTs_Tonemapping Only\DS_4_Values.CUBE"
setProperty op "colorMappingOperator.opacity" 1
setProperty renderers.current "colorMap.pipeline" op

op2 = FilmicOperatorPlugin()
setProperty op2 "colorMappingOperator.id" 2
setProperty op2 "colorMappingOperator.enabled" true
setProperty op2 "colorMappingOperator.highlightCompression" 1
setProperty op2 "colorMappingOperator.Richshadows" 1
setProperty op "colorMappingOperator.nextOperator" op2

op3 = ReinhardOperatorPlugin()
setProperty op3 "colorMappingOperator.id" 3
setProperty op3 "colorMappingOperator.enabled" true
setProperty op3 "colorMappingOperator.highlightCompression" 0.6
setProperty op2 "colorMappingOperator.nextOperator" op3

op4 = SaturationOperatorPlugin()
setProperty op4 "colorMappingOperator.id" 4
setProperty op4 "colorMappingOperator.enabled" true
setProperty op4 "colorMappingOperator.Saturation" -0.10
setProperty op3 "colorMappingOperator.nextOperator" op4

op5 = GreenMagentaTintOperatorPlugin()
setProperty op5 "colorMappingOperator.id" 5
setProperty op5 "colorMappingOperator.enabled" true
setProperty op5 "colorMappingOperator.greenMagentaTint" 0
setProperty op4 "colorMappingOperator.nextOperator" op5

op6 = WhiteBalanceOperatorPlugin()
setProperty op6 "colorMappingOperator.id" 6
setProperty op6 "colorMappingOperator.enabled" true
setProperty op6 "colorMappingOperator.colorTemperature" 6500
--setProperty op2 "colorMappingOperator.Falloff" 0
setProperty op5 "colorMappingOperator.nextOperator" op6

op7 = VignetteOperatorPlugin()
setProperty op7 "colorMappingOperator.id" 7
setProperty op7 "colorMappingOperator.enabled" true
setProperty op7 "colorMappingOperator.Intensity" .7
--setProperty op2 "colorMappingOperator.Falloff" 0
setProperty op6 "colorMappingOperator.nextOperator" op7

op8 = SimpleExposureOperatorPlugin()
setProperty op8 "colorMappingOperator.id" 8
setProperty op8 "colorMappingOperator.enabled" true
setProperty op8 "colorMappingOperator.simpleexposure" -0.55
setProperty op7 "colorMappingOperator.nextOperator" op8


Quote
The tone mapping stack cannot be created from scratch using maxscript, or controlled using maxscript, unless you perform some manual intervention from the user interface first (e.g. create some new operators, change their values by hand). For example, if you create a fresh new scene and it already has some existing tone mapping stack, you will not be able to adjust its values using maxscript unless you change some of the values manually first. There are some technical reasons for this, and we did not predict that it could cause some issues to our users.

Could you explain in what circumstances my maxscript code won't work? So I know when I can just punch out all of my passes without having doubt? I just tried this on my base max template that has a tone mapping stack in it - and it worked.

And regarding ease of editing the code - if I want to add in an operator half way, is there an easy way to do this without repeatedly changing the Op, ID, and Property numbers for the whole script?

Thanks
« Last Edit: 2022-06-16, 01:37:31 by DPS »
Specs: AMD 1950X, Aorus Gaming 7 x399, 64GB RAM, 1080ti. Win10, Max 2017, Corona 1.7.3