Sub materials links and undo
-
Hi!
I am working on a material plugin (MaterialData).
Some materials may have links to other materials via BaseContainer links.
If I change linked materials, I want to update material preview of dependent materials.
For now I am catching MSG_UPDATE message in the linked materials and searching for all depended materials in the document and callbm->Update(true, true);
bm->Message(MSG_UPDATE);
bm->SetDirty(DIRTYFLAGS::ALL);
EventAdd();It works well until a user press undo.
In this case MSG_UPDATE message is not sent, only MSG_CHANGE. And even if I use this message to update the depended materials, their BaseContainer links are pointing to old materials (before undo).
How can I update all dependent materials in case of undo case?
Thank you
-
Based on responses I guess I asked some nonsense.
Let me ask the question in a different way.
I have two BaseMaterials - Material_1 and Material_2.
Material_1 has a link to Material_2 in it's BaseContainer.
If I edit Material_2 and then press undo, it gets replaced with its copy, and Material_1 link is updated with a new Material_2.
Is there any message/notification regarding such link update?
Thank you.
-
Hello @DronKozy,
Welcome to the Maxon developers forum and its community, it is great to have you with us!
Getting Started
Before creating your next postings, we would recommend making yourself accustomed with our forum and support procedures. You did not do anything wrong, we point all new users to these rules.
- Forum Overview: Provides a broad overview of the fundamental structure and rules of this forum, such as the purpose of the different sub-forums or the fact that we will ban users who engage in hate speech or harassment.
- Support Procedures: Provides a more in detail overview of how we provide technical support for APIs here. This topic will tell you how to ask good questions and limits of our technical support.
- Forum Features: Provides an overview of the technical features of this forum, such as Markdown markup or file uploads.
It is strongly recommended to read the first two topics carefully, especially the section Support Procedures: How to Ask Questions.
About your First Question
I am afraid there is no really good way to do what you want to do. Without example code, I also have to somewhat guess what is going on. As lined out in our support procedures, we recommend to always accompany questions with compileable code.
I it is a bit fuzzy to me what you are doing, please tell me when I got it wrong. You have a
BaseMaterialimplementation which itself hasLINKparameters which link to other materials. You now want to updateMATPREVIEWparameter manually when your dependencies update.Tracking Changes
Cinema generally follows an opt-out and not an opt-in update/message model. E.g., all objects get their
GetVirtualObjectsmethod called on each scene update, and it is then up to the object to decide if they actually want to update or just keep using their existing cache.The evaluation of materials happens at render time, so there is no direct function which is called or message which is sent to your plugin when something in the scene is being updated. The messages you are using somewhat go into that direction, but you misunderstood a bit their purpose.
MSG_UPDATEis sent when an external entity wants to inform a node that it modified dependent data and that the node should update its internal data (outside of the general scene state rebuild). It is not a message that is being sent each time the node has been updated. I could for example get a point object, modify its points, and then not send that message and that would be totally valid code. The object would only update once Cinema 4D reevaluates the object on its own, but sometimes this is desirable. For user interactions, Cinema 4D will usually send this message, but its purpose is still a bit different from what you think it is. The same goes forMSG_CHANGE.The way to track changes in Cinema 4D, is the dirty system found on C4Datom. Cinema will usually automatically entail updates when the dirtiness of something changed, e.g., when a user changed the parameters of a node. The problem is that for
LINKparameters (and also shader links), changes to the linked node do not count towards the data dirtiness of the node. Or in other words, Cinema does not consider a node A to be changed when the node B changed to which A links. For something like objects this is not really a problem due to the out-out update model, for material previews this means you can get event starved. The video below demonstrates the effect. -
Hi Ferdinand
Thank you a lot for the reply.
I am working on a render plugin (FStormRender) for C4D.
Cinema 4D environment is new for me (after 3ds max), but I am slowly adapting.The biggest challenge is how to organize materials/shaders node system.
I'm trying to choose between a selfmade node system like Corona/Octane and Cinema 4d native one like RedShift.Corona/Octane way looks more flexible, where you can connect any materials/textures to any pins (just avoid loop connections), but not native for Cinema 4D, and as you mention, it requires some creativity.
-
Yeah, I got the general direction, that you are probably implementing a material mixer type of material/shader. When you implement a full render engine binding, you should go the event notification route, as I am sure you can then easily handle the (slight) complexity that comes with them.
Regarding the architecture, in principle you can do with whatever you want. As Maxon employee I would of course recommend to use our Nodes API (what you call 'native'). The SDK contains both code examples and documentation about this. But this biggest flaw of the Nodes API is probably that it is not entirely non-trivial. But implementing a full node editor also requires a relatively high level of expertise about our APIs, although in different areas.
Currently Redshift, Vray, Arnold, and CentiLeo use the Nodes API and all other render engines (Corona, Octane, Cycles, etc.) use either a completely custom system or the old Xpresso Nodes API.
Cheers,
FerdinandPS: When you are developing a render engine binding, you might want to consider our Maxon Registered Developer Program.