Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Create material from template (Set as default)

    Scheduled Pinned Locked Moved PYTHON Development
    9 Posts 0 Posters 859 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 08/01/2013 at 14:00, xxxxxxxx wrote:

      I am creating a new material with this scipt:

          lMat = c4d.BaseMaterial(5703)   
          doc.InsertMaterial(lMat)   
          c4d.EventAdd()
      

      However, this creates a default material. Is there any way to create a user-defined material? You know, the user can customize his material and then save it as default by selecting 'Set as default' in the attribute manager. For example any time I create a new material, the specular channel is deactivated and a fresnel shader is loaded into the reflection channel. This is my template for a default material.

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 09/01/2013 at 01:27, xxxxxxxx wrote:

        Originally posted by xxxxxxxx

        However, this creates a default material. Is there any way to create a user-defined material? You know, the user can customize his material and then save it as default by selecting 'Set as default' in the attribute manager. For example any time I create a new material, the specular channel is deactivated and a fresnel shader is loaded into the reflection channel. This is my template for a default material.

        You can call the command that creates a new material with the ID 13015 (IDM_MENU, defined in resource\c4d_symbols.h ) :

        c4d.CallCommand(13015)
        

        This is also outputted to the Script Log when the "New Material" menu in the Material Manager is clicked.

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 11/01/2013 at 06:58, xxxxxxxx wrote:

          Thank you for you reply. This works for a standard material, but not for Vray Materials. The script log says for a new VrayAdvancedMaterial the following: CallCommand(58000); // 3D Shader
          However, it says the same for all Vray Materials: Advanced, Blend, Override, 2Sided, etc. Calling this command again from the script manager does not seam to do anything.

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 11/01/2013 at 09:09, xxxxxxxx wrote:

            You need to allocate the material with BaseMaterial::Alloc, using the ID for the material you want. So for a Vray Advanced Material you would do:

              
            BaseMaterial *mat = BaseMaterial::Alloc(ID_VRAYBRDF_MATERIAL);   
            

            That's in C++, just translate into Python for your script. You can find the IDs you need in the vraybridge/res/description folder, in files such as mVrayAdvancedMaterial.h, mVray2SidedMaterial.h, etc.

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 11/01/2013 at 12:49, xxxxxxxx wrote:

              Isn't this the same as what I posted in my first post? And would this really create a user-defined material (one that the user set as default earlier)?

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 11/01/2013 at 13:25, xxxxxxxx wrote:

                Originally posted by xxxxxxxx

                Isn't this the same as what I posted in my first post? And would this really create auser-defined material (one that the user set as default earlier)?

                It depends on what the actual integer representation of the plugin ID for a vray advanced 
                material is. I do not not have vray, so i cannot test it, but i highly doubt it is 5703, because 
                third party plugin ids are usually longer. 5703 sounds more something that c4d uses for its 
                native  'types'  . if i am wrong about the number, the code steve has posted is the same as 
                the code you have posted on your first posting. i think he just wanted to stress that it is 
                more convenient to use the string form of an ID than the actual number.

                myVrayMaterial = c4d.BaseMaterial(c4d.ID_VRAYBRDF_MATERIAL)

                that is the way in c4d to instantiate a subtype of an base class - you pass the plugin ID of 
                the subtype to the constructor of the base class. this also includes any type of plugin class 
                which has been derived from this base class.

                i am  not sure hat you mean with  user defined. your code does the same , as if you would  
                createa material from scratch in the material editor. your code has nothing to do with loading 
                a material preset. if you want to do something like that you should check c4d.documents.

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  On 12/01/2013 at 02:01, xxxxxxxx wrote:

                  Originally posted by xxxxxxxx

                  Isn't this the same as what I posted in my first post?

                  No, of course not. It uses the plugin ID for that specific kind of material. You would do the same - with a different ID - for other materials, such as simbiont shaders, the old SLA shaders, etc. It's all in the ID. Look up BaseMaterial::Alloc in the SDK, and then at the 'type' parameter.

                  I don't know what you mean by a 'user-defined' material either. If you mean a shader that someone else has coded, then you use this technique with the appropriate ID.

                  (Edit: looking back at your original post, if the user changes the default settings for a particular material, then creating a new material of that type will load it with the new settings.)

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    On 12/01/2013 at 02:54, xxxxxxxx wrote:

                    Originally posted by xxxxxxxx

                    (Edit: looking back at your original post, if the user changes the default settings for a particular material, then creating a new material of that type will load it with the new settings.)

                    Unfortunately, that's not the case. If I create a new VrayAdvancedMaterial with ID_VRAYBRDF_MATERIAL (or with the Interger ID which I looked up and it is indeed longer, the 5703 was for the c4d material), the new settings will not be loaded. The material will be created as if after a clean install. The user settings will not be taken in account. This is the same as with default C4D materials (see first post). When you create a new c4d material with its corresponding ID, the user settings will not be loaded.

                    1 Reply Last reply Reply Quote 0
                    • H Offline
                      Helper
                      last edited by

                      On 12/01/2013 at 03:17, xxxxxxxx wrote:

                      That's interesting. I wouldn't have thought that would happen. There must be something different between creating one by using Alloc and creating it in C4D itself.

                      I've just done some tests with a COFFEE script and indeed you get the original settings, not the changed default. So your only option I think is to create the new material, then change its settings to what you want, then insert it into the document. It looks as thought you can't rely on getting the saved default settings.

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post