Rendering to a temp Document?



  • On 08/09/2013 at 12:35, xxxxxxxx wrote:

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

    ---------
    Hi,

    I'm trying to figure out how to render things to a temporary document while I'm working on the scene.
    I can clone the active document like this: BaseDocument *tmpDoc = doc->Polygonize(TRUE);

    But how do I execute the rendering to the picture viewer in that temp document?

    -ScottA



  • On 08/09/2013 at 13:07, xxxxxxxx wrote:

    You can trigger the "Render to Picture Viewer" button. Afaik there is no direct way to simulate this
    command from the SDK. Using RenderDocument() with the RENDERFLAGS_CREATE_PICTUREVIEWER
    only shows the picture after it has actually been rendered.

    You do not even have to polygonize the document. If at all, you need to create a copy. But if you 
    already have a clone of the document from somewhere, you can tell RenderDocument() not to
    re-clone the document because you already did by passing RENDERFLAGS_NODOCUMENTCLONE.

    Best regards,
    -Niklas



  • On 08/09/2013 at 14:06, xxxxxxxx wrote:

    The problem I'm running into is that If I try to execute anything. It will execute in the document I'm working in. Not the temp doc.
    I need a way to tell the temp doc to trigger the RPV command. Not the doc I'm working in.

    I was able to get the temp doc to render using RenderDocument().
    But like you said. It only returns the last frame. But worse than that...It locks up the current document I'm working in. Due to threading.
    So I guess using a temp doc isn't really going to do what I want.

    This is what I'm doing by hand manually. That I'm trying to do with code:
    -Make a copy of my current scene (document)
    -Execute the RPV rendering in the copy
    -Go back to the original scene and continue working. While the other document is rendering.

    There's no threading problems when I use this workflow. Because they are two different documents.
    But I'm having a devil of a time automating this workflow.

    What do you recommend I use for copying the document Niklas?

    -ScottA



  • On 08/09/2013 at 15:54, xxxxxxxx wrote:

    Originally posted by xxxxxxxx

    This is what I'm doing by hand manually. That I'm trying to do with code:
    -Make a copy of my current scene (document)
    -Execute the RPV rendering in the copy
    -Go back to the original scene and continue working. While the other document is rendering.

    These are actually the exact steps I do in my PV Render Queue plugin. It is a nasty
    workaround, but I couldn't find another way to simulate the "Render to Picture Viewer" button
    than to actually call it.

    A snippet from my plugin's source code:

        CMD_RENDERPV = 12099
    
    
      
    
    
    
        def RenderFile(self, file\_) :
            file\_.done = True
    
            flags = c4d.SCENEFILTER_OBJECTS | c4d.SCENEFILTER_MATERIALS
            doc = c4d.documents.LoadDocument(file\_.filename, flags)
            if not doc:
                print "Document could not be opened:", file\_.filename
                return
    
            active_doc = c4d.documents.GetActiveDocument()
            c4d.documents.InsertBaseDocument(doc)
            c4d.documents.SetActiveDocument(doc)
            c4d.CallCommand(CMD_RENDERPV)
            c4d.documents.KillDocument(doc)
    
            if active_doc() :
                c4d.documents.SetActiveDocument(active_doc)
    

    Instead of loading a new document, you'd create a clone.

    Best regards,
    -Niklas



  • On 08/09/2013 at 16:36, xxxxxxxx wrote:

    Thanks for posting that code Nik.
    After thinking about it some more. I think that's really pretty much sufficient for my needs.
    And I don't really need to get any fancier with it than that right now.

    Here's the C++ version I'm using:

        Filename name = doc->GetDocumentName();    //Gets the name & extesion  of the document without the path  
      Filename path = doc->GetDocumentPath();      //Gets the file's path, minus the file's name and extension  
      String fullPath = path.GetString() + "\\" + name.GetString();   //Combine them to get the full file path  
      
      //Save the scene before we open it back up and render it  
      //This lets us change the scene and get accurate rendering results  
      SaveDocument(doc, fullPath, SAVEDOCUMENTFLAGS_0, FORMAT_C4DEXPORT);  
      
      //Open the scene   
      BaseDocument *docCopy = LoadDocument(fullPath, SCENEFILTER_OBJECTS | SCENEFILTER_MATERIALS, NULL);  
      
      //Insert the scene into the CINEMA editor list of documents  
      InsertBaseDocument(docCopy);  
      SetActiveDocument(docCopy);  
      CallCommand(12099);        //Render to picture viewer  
      KillDocument(docCopy);
    

    Thanks for the help.
    I was making it a lot more complicated than it needed to be.

    -ScottA


Log in to reply