Texture file sequence, get exact filename per frame
-
Hi!
For a render engine plugin, I would like to support animations (file sequences) as textures. In the bitmap shader, there are settings for animation, and c4d the automatically parses the texture file name to identify the frame number part which is modified per frame to render the appropriate texture.Is there anyway to get, for a given Bitmap shader and timepoint (BaseTime or frame), the exact texture name that c4d would load for rendering?
We could try to reverse engineer this of course, but it would be really convenient and more robust if there was a function for accessing this.
Thanks!
/Filip -
Hi,
I am not sure if that helps, but
BaseShader::GetBitmap
returns the correct bitmap. I do not have any image sequences lying around here, but I would assume it also does work there. The interpolation offset is determined by the document time of theBaseDocument
you are passing toBaseShader::InitRender
. As a Python example (I left out all the ifs and whens), the first material needs to be a standard material with some kind of movie in the color channel. Scrubbing the timeline and executing the script will cause it to open the corresponding frame of that movie in the Picture Viewer.You could then try to get the filename from that
BaseBitmap
. BASEBITMAP_DATA might be helpful in that context.Cheers,
zipitimport c4d def main(): """ """ material = doc.GetFirstMaterial() shader = material[c4d.MATERIAL_COLOR_SHADER] irs = c4d.modules.render.InitRenderStruct(doc) shader.InitRender(irs) bitmap = shader.GetBitmap() shader.FreeRender() c4d.bitmaps.ShowBitmap(bitmap) if __name__=='__main__': main()
-
Thanks for the input zipit!
That is promising, but unfortunately does not quite help in my case as I really need the filename rather than the bitmap itself. The rendering in my plugin is also, for various good reasons, not guaranteed to happen within a InitRender()/FreeRender() context.
/Filip
-
Hi,
jeah, I already suspected something like that; that is why included the link to
BASEBITMAP_DATA
. WithBaseBitmap::GetData
you can access these attribute, including several frame related attributes. The whole thing is flagged asprivate
in both the C++ and Python docs, which usually means that things won't be as easy as one might think, which is why I did not really bother to go down that rabbit hole.Not quite sure about the
InitRender
part. If you want to interpret aXbitmap
BaseShader
like Cinema would, you will have to sample it, i,e. init that shader for rendering. Everything else would be an eating the cake without eating it scenraio.Cheers,
zipit -
That
BASEBITMAP_DATA
stuff is related to rendering information when a bitmap is displayed in the Picture Viewer (BaseBitmap Manual). -
@PluginStudent said in Texture file sequence, get exact filename per frame:
That
BASEBITMAP_DATA
stuff is related to rendering information when a bitmap is displayed in the Picture Viewer (BaseBitmap Manual).Oh, I did not know that. Thanks for the link.
-
Hi @Filip , thanks for reaching out us.
With regard to your question, I confirm there's no available method in our API that provides you with the exact name of the bitmap used at a certain frame.
The information about which exact bitmap to fetch from the sequence of textures set in the BitmapShader, is instead calculated programmatically given the data stored inBITMAPSHADER_TIMING_FROM BITMAPSHADER_TIMING_TO BITMAPSHADER_TIMING_FPS BITMAPSHADER_TIMING_TIMING BITMAPSHADER_TIMING_MODE BITMAPSHADER_TIMING_LOOPS BITMAPSHADER_TIMING_RANGEFROM BITMAPSHADER_TIMING_RANGETO
Best, R
-
@r_gigante Thanks for confirming. We will try to reverse engineer the filenames based on that data.
Cheers
/Filip