Yes, it's a pain in the neck doing macOS development. I almost gave up on it at one point it's such a hassle. But once you figure out all the hoops to jump through, it's not too bad. You might want to take a look at my guide to notarizing a mac plugin on my site at https://microbion.co.uk/html/createplugins_r23_3_notarize.htm. This explains the steps needed; the first step is the Apple developer account, which is what I think the tutorial you read must have been referring to. Unfortunately, unlike an Apple ID, getting a dev account is not free.
@m_adam Thanks very much for your comments. You asked which parts of the manual page weren't clear. It's more that it's incomplete, in that it doesn't tell you how to get a bundle ID, app password or provider ID. Also, I don't think the statement that adding a timestamp is optional if you enable the hardended runtime is correct - from what I can see, you must provide a timestamp even though you enable the hardended runtime.
The other thing is that invariably at some point the process is going to fail and there's no mention of what to do when it does. It's extremely frustrating when the notarization fails and you have to figure out why. Apart from that, the page is actually very good - just needs a bit more detail (IMO).
Take a look at the command line arguments passed to the project tool in your screen shot. The project tool is looking in the wrong place.
That's great, I'll take a look at that file and see what happens with that. Many thanks once more for your help.
(Later) Got, it, works perfectly, thank you very much!
I had occasion to do this recently and it's all explained in the Redshift Renderer section of the SDK documentation. Basically, you access the port and set its default value. There's an extra step for adding a bitmap to a texture node, but it's the same principle.
Changing to Redshift from code is straightforward and works fine. But, if you change to Redshift manually in the render settings dialog, C4D also changes its menus - the Redshift menu appears in the main menu and there are changes in the Window and Create menus, and possibly others.
When changing to Redshift programatically this doesn't happen, the menus are unchanged. Is there a way to force the menu update in Cinema? I've tried using EventAdd() but it doesn't help. It's a bit disconcerting for users to see that Redshift is being used to render but they can't access the Redshift RenderView window, for example. The only way is to manually change back to the standard renderer and then switch to Redshift manually.
I wondered if this is possible or just something users will have to live with.
Ah...so simple in the end! Navigating this maze of interdependent classes used in the node system is not easy, that's my excuse
Many thanks for this, it solves a very tricky problem I was having.
I'm following the Redshift renderer page in the SDK for R26.1 to create nodes in a Redshift node graph. This all works fine, and adding nodes and making connections is all good. But I wondered, adding a node is simple but how do you remove a node? If adding a node works like this:
const::maxon::nodes::NodesGraphModelRef& nodeGraph = nodeMat->GetGraph(redshiftId) iferr_return;
maxon::GraphNode textureNode = nodeGraph.AddChild(maxon::Id(), textureId) iferr_return;
Then I'd have expected something like this to be available:
nodeGraph.RemoveChild(textureId); // no such function
But there is nothing like this to use. There is a Remove() function in the GraphModelInterface class but it's protected and not available from the NodesGraphModelRef class.
Is there a way to delete nodes from a Redshift material node graph? I wondered about using ReplaceChild() to replace the node to be deleted with nothing, but there doesn't seem to be a way to do that either.
Just tried the code and got it working now, no problems. Many thanks for taking the time to sort this out for me, very much appreciated!
Thank you very much for this very long and helpful post. It's definitely going above and beyond the usual support. I think TBH it ought to become part of the DescID manual in the SDK docs, it's so useful.
I'll need to peruse it at length to be sure I understand how it all works, but with this I'm sure I can get it working. I'll mark this thread as solved when I do.
I'm sorry to keep harping on about this but there's something odd here. In case the 'RSFILE' custom GUI was causing problems I tried to set sub-channels in the dome light colour. If you look at this code, having created a Redshift dome light I set the object's base color (in the Basic tab) using a two-level DescID method to set a sub-channel. This works correctly. Then I tried the same thing to set the dome light colour - but it doesn't work. Using a single-level DescID does work, however, to set the light intensity:
// two-level DescID works on BaseObject parameter
const DescID domeLightBaseColorId = DescID(DescLevel(ID_BASEOBJECT_COLOR), DescLevel(VECTOR_X));
domeLight->SetParameter(domeLightBaseColorId, param, DESCFLAGS_SET::NONE);
// single-level DescID works correctly on Redshift dome light parameter
const DescID domeLightMultiplerId = DescID(DescLevel(REDSHIFT_LIGHT_DOME_MULTIPLIER));
domeLight->SetParameter(domeLightMultiplerId, param, DESCFLAGS_SET::NONE);
// two level DescID does not work on Redshift dome light parameter
const DescID domeLightColorId = DescID(DescLevel(REDSHIFT_LIGHT_DOME_COLOR), DescLevel(VECTOR_Y));
domeLight->SetParameter(domeLightColorId, param, DESCFLAGS_SET::NONE);
I also tried setting the dome light colour using a single-level DescID and this works without problems, but I couldn't set the individual sub-channels using the above method.
Either I'm being really dumb or there's something not working with this method when accessing a Redshift object.
Thank you very much for taking the time to post the pseudocode. I know you must be very busy right now!
Unfortunately I've tried this method numerous times and I just can't get it to work. Here's the code:
Bool MyDialog::CreateRSDomeLight(BaseDocument* doc, BaseObject* parent, BaseObject* prev, Filename fullPath)
Bool success = false;
BaseObject* domeLight = nullptr;
domeLight = BaseObject::Alloc(RSLight);
if (domeLight != nullptr)
domeLight->SetParameter(DescID(REDSHIFT_LIGHT_TYPE), param, DESCFLAGS_SET::NONE);
doc->InsertObject(domeLight, parent, prev, false);
success = true;
// all working fine until now
String pathToFile = fullPath.GetString(); // path is verified as correct
const DescID rsDomeLightTexturePathId = DescID(DescLevel(REDSHIFT_LIGHT_DOME_TEX0), DescLevel(REDSHIFT_FILE_PATH));
if (!domeLight->SetParameter(rsDomeLightTexturePathId, param, DESCFLAGS_SET::NONE)) // <- Fails here
ApplicationOutput("Failed to write Texture.Path component in RS DomeLight.");
success = false;
It allworks fine up to the point when SetParameter() is called using the two-level DescID. It doesn't crash, just fails to set the bitmap into the link field. I must be doing something wrong but I can't see anything obvious. What am I missing?