BaseTime and doc->SetTime()

  • On 09/09/2017 at 19:29, xxxxxxxx wrote:

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

    Hi folks,

    Edit: same thing happens in the main thread too.

    I'm running a threaded operation where I'm playing back a scene in memory. Nothing fancy, just trying to make the document increment one frame at a time. I'm doing this by:

    //psuedo code, doc is in memory only
    BaseTime tm;
    // for the purposes of here, lets assume we're wanting frame 23
    doc->SetTime(tm); // does not set to frame 23
    doc->ExecutePasses(this->Get(),TRUE,TRUE,TRUE,BUILDFLAGS_0); // always returns TRUE
    // this always returns RENDERESULT_OK
    // if I print the frames from the basetime and the doc, this is what I get
    GePrint("Time frame = " + RealToString(tm.GetFrame(..)); // CORRECT 23
    GePrint("doc frame = " + RealToString(doc->GetTime().GetFrame(doc->GetFps()))); // INCORRECT 0

    The problem I'm having is that the document is not animated to the correct frame. What I have noticed, is that the document changes time based on the frame rate. So if the frame rate is 30fps, then when I set the document time with any frame from 0-29, it only executes frame 0, and when the frame count reaches frame 30 the document is then set to the correct frame. The same thing happens from frames 30-59, the doc doesn't change until it gets to frame 60. It seems to go in multiples of the frame rate.

    Is there something about BaseTime I'm not understanding, or doc->SetTime()? Is there something about doing this in a threaded environment means it won't animate correctly? Or, is this another issue, some function call I've missed? An incorrect flag? Something in my math? Something else?


  • On 10/09/2017 at 00:36, xxxxxxxx wrote:

    Set the numerator to the desired frame (23) and the denominator to the document frame rate (e.g 30). This will set the time to 23/30ths of a second.


  • On 10/09/2017 at 02:14, xxxxxxxx wrote:

    Hi Steve,

    that's what I originally had, which is why I changed it to the above, to try something different (loosely based off some code I saw here somewhere). I was under the impression BaseTime worked as a fraction, e.g. 3 over 25, or 0.25 over 1.0, and that it didn't matter so much the values you set it with but the fraction value it's worth (if that makes sense!).

    I changed it back, and the issue is still there, although I can see that the doc time is now showing the correct frame. But it's still not drawing the correct frame.


  • On 11/09/2017 at 02:47, xxxxxxxx wrote:

    Don't know if it's RenderDocument() doing something here or not. I can GePrint() the correct frame just before I render it, but the rendered frame is not the correct frame.

    // prints correct frame
    GePrint("Rendering frame " + RealToString(doc->GetTime().GetFrame(Animation->GetFps())));
    BaseContainer rdata;
    Set_RenderData(&rdata,Width,Height);  // sets some default render settings
    // renders incorrect frame
    RENDERRESULT Result = RenderDocument(doc,rdata,nullptr,nullptr,Renderer,RENDERFLAGS_EXTERNAL|RENDERFLAGS_NODOCUMENTCLONE,Thread);


  • On 11/09/2017 at 03:00, xxxxxxxx wrote:

    D'oh! I wasn't setting the frame rate in the render container!

    I'll see myself out. Tongue


  • On 11/09/2017 at 09:32, xxxxxxxx wrote:


    I'm glad you found your problem. Don't feel bad about it, we all have these days...

    For everybody reading this thread in future:

    1. As steve pointed out, the code in the first post does not properly set BaseTime.
    2. The manuals on BaseDocument (Animate) and BaseTime may help on this topic.

Log in to reply