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

    Cinema4D's break point in BakeTexture

    SDK Help
    0
    8
    704
    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
      Helper
      last edited by

      On 04/07/2017 at 14:51, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R18 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Hello.

      I've got some problems when I try to use BakeTexture for a sub-shader in a ShaderData plugin.

      Here is the scenario. I have a ShaderData plugin with a shaderlink parameter.  The shader set in that shaderlink parameter has to be baked.

      So, in InitRender of the ShaderData, I use BakeTexture in the inner shader and I get a breakpoint here:

      CINEMA 4D.exe!00007ff6c91528ce() Unknown
      CINEMA 4D.exe!00007ff6c915283d() Unknown
      c4dplugin.xdl64!00007ff89d020528() Unknown
      c4dplugin.xdl64!00007ff89e92fe49() Unknown
      c4dplugin.xdl64!00007ff89d050c43() Unknown
      sla.cdl64!00007ff89019b52f() Unknown
      sla.cdl64!00007ff890199e29() Unknown
      <..... My method call that uses BakeTexture.......>

      This problem with BakeTexture appears ONLY in the ShaderData's InitRender.
      I use the same texture baking code in other places and everything works fine. 
      I use the thread and document that are passed in InitRender.
      Once I continue after the break point, the returned value of BakeTexture is BAKE_TEX_ERR_NONE.
      The BakeTexture's result is correct.

      How can I find the problem here ?

      Thank you very much for your time.

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

        On 05/07/2017 at 09:15, xxxxxxxx wrote:

        Hi,

        you gave me some headache here. Actually I was wondering, how do you use BakeTexture() to bake a shader? And even worse, where do you get the needed infos, when in InitRender()?
        So I came up with my own solution, which does not show any problems. The sub-shader gets baken without any breakpoint or crash.
        Maybe you can tell us, what exactly you are doing in InitRender()?

        Here's roughly what I did:

        - chn argument -> the BaseDocument.
        - VolumeData (in irs argument) -> RayObject and TexData.
        - TexData -> TextureTag and from this BaseObject
        - Cloned the object (including tags, these tex and uvw tags will be used later on) and the sub-shader
        - Created a new document, inserted cloned object
        - Created new material
        - Inserted the cloned shader and assigned it to the color channel (actually same channel the sub-shader is assigned to)
        - Inserted new material into new document
        - Set material of tex tag on cloned object to refer to new material

        With all of this I was able to use InitBakeTexture() and BakeTexture() in InitRender to get a proper image of a noise shader without any breakpoints.

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

          On 17/07/2017 at 03:22, xxxxxxxx wrote:

          Hello and thank you very much for your support !

          I don't use the VolumeData passed in InitRender's InitRenderStruct.
          I create a dummy plane from which I retrieve the uvw tag that will be used later on InitBakeTexture:

          	
          	BaseContainer plane_data;
          	plane_data.InsData(PRIM_PLANE_SUBW,GeData(1));
          	plane_data.InsData(PRIM_PLANE_SUBH,GeData(1));
            
          	BaseObject* plane = GeneratePrimitive(dummy_document, Oplane, plane_data, 1.0, false, baking_thread);
          	ModelingCommandData command_data;
          	command_data.doc = dummy_document;
          	command_data.op = plane;
            
          	if (!SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT,command_data)) {
          		BaseObject::Free(plane);
          		return false;
          	}
          	BaseObject::Free(plane);
            
          	BaseObject* polygon_plane = static_cast<BaseObject *>(command_data.result->GetIndex(0));
          	bake_uvw_tag = (UVWTag * )polygon_plane->GetTag(Tuvw,0);
            
          	bake_texture_tag = TextureTag::Alloc();
          	bake_texture_tag->SetParameter(DescID(TEXTURETAG_PROJECTION),TEXTURETAG_PROJECTION_UVW,DESCFLAGS_SET_0);
          	polygon_plane->InsertTag(bake_texture_tag);   
          	dummy_document->InsertObject(polygon_plane,NULL,NULL);
          

          The dummy_document in the above code is the cloned one. bake_uvw_tag and bake_texture_tag are used in InitBakeTexture.
          So basically I skip the steps 2,3,4 in your post and I replace them with the code above. 
          Does this cause any problem ?

          Thank you.

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

            On 18/07/2017 at 07:53, xxxxxxxx wrote:

            Ok, by my approach I somewhat shot myself in the knee... sorry!

            As I took the information from the VolumeData, I baked only if the VolumeData was existent. Obviously missing the case, where no VolumeData is available, which is the case when the shader preview gets rendered/prepared.

            In this case there's a threading issue, as BakeTexture() internally wants to do something, it is not allowed from a worker thread. So there's unfortunately no solution in this case.

            But lets look at it from a different perspective. Why do you need to bake? Couldn't you just sample the sub-shaders? If this could be an option, the BaseShader manual has a code snippet demonstrating how to do it properly.

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

              On 19/07/2017 at 02:09, xxxxxxxx wrote:

              Hello.

              The thread that is used for baking is NULL (taken from InitRenderStruct).
              I use texture baking because I want to produce an image based on that shader.
              I could use sampling, but isn't it slower ?

              Thank you for your time Andreas !

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

                On 19/07/2017 at 09:18, xxxxxxxx wrote:

                I haven't done any measurements and in the end it may probably depend on the scenario. But when baking the shader needs to be sampled as well.

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

                  On 20/07/2017 at 00:27, xxxxxxxx wrote:

                  Hello Andreas.

                  Allow me to ask one last thing before replacing texture baking with sampling.
                  Do they produce the same result if set correctly ? 
                  If I'm about to replace texture baking with sampling, I need them to produce the exact same image.

                  Thank you again !

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

                    On 20/07/2017 at 01:24, xxxxxxxx wrote:

                    Well, that depoends highly on the scenario, especially on the bake settings. With sampling you won't get any lighting information or effects.

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