Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 18/03/2008 at 18:38, xxxxxxxx wrote:
User Information: Cinema 4D Version: 9.6+ Platform: Windows ; Mac OSX ; Language(s) : C++ ;
--------- Hi all,
I need to call RenderDocument and get back the alpha channel.
I tried to pass a Bitmap with the alpha.. but seem that alpha is wrote in another layer.
How i can get the alpha?
(i'm in the MaterialData::InitGLImage)
Thanks in advance renato
On 20/03/2008 at 06:12, xxxxxxxx wrote:
I have some problems too to get it to work. I asked the developers about it.
cheers, Matthias
On 20/03/2008 at 06:51, xxxxxxxx wrote:
Thanks Matthias,
i'm looking forward for your help
cheers Renato
On 23/03/2008 at 09:49, xxxxxxxx wrote:
Still Nothing?
cheers renato
On 23/03/2008 at 15:14, xxxxxxxx wrote:
I will post when I know the answer. Anyway it's eastern holidays here.
On 28/03/2008 at 00:55, xxxxxxxx wrote:
The bitmaps in InitGLImage are special 16bit bitmaps and can be only filled with SetPixel/GetPixel and some other few functions. Here a working example that fills the alpha channel of the bitmap. You have to make sure that it exists, otherwise you have to create one of your own.
> \> Bool SimpleMaterial::InitGLImage(PluginMaterial \*mat, BaseDocument \*doc, BaseThread \*th, BaseBitmap \*bmp) \> { \> if(bmp) \> { \> AlphaBitmap \*alpha = bmp->GetInternalChannel(); \> if(!alpha) alpha = bmp->AddChannel(TRUE, FALSE); \> \> LONG bw = bmp->GetBw(); \> LONG bh = bmp->GetBh(); \> LONG x,y; \> \> for(y=0; y<bh; y++) \> { \> for(x=0; x<bw; x++) \> { \> bmp->SetPixel(x, y, 255, 0, 0); \> bmp->SetAlphaPixel(alpha, x, y, 128); \> } \> } \> } \> \> return TRUE; \> } \>
\> Bool SimpleMaterial::InitGLImage(PluginMaterial \*mat, BaseDocument \*doc, BaseThread \*th, BaseBitmap \*bmp) \> { \> if(bmp) \> { \> AlphaBitmap \*alpha = bmp->GetInternalChannel(); \> if(!alpha) alpha = bmp->AddChannel(TRUE, FALSE); \> \> LONG bw = bmp->GetBw(); \> LONG bh = bmp->GetBh(); \> LONG x,y; \> \> for(y=0; y<bh; y++) \> { \> for(x=0; x<bw; x++) \> { \> bmp->SetPixel(x, y, 255, 0, 0); \> bmp->SetAlphaPixel(alpha, x, y, 128); \> } \> } \> } \> \> return TRUE; \> } \>
On 28/03/2008 at 06:15, xxxxxxxx wrote:
Hello Matthias,
thanks for this but is exactly what i done the first time.. but what i need is to Call:
RenderDocument before fill this 16bit bitmap.
so inside the InitGLImage i need to call renderdocument.. and get back the ALPHA.
thanks for now renato
On 28/03/2008 at 06:22, xxxxxxxx wrote:
Please remember to set the PLUGINFLAG_MATERIAL_GLIMAGE flag in the RegisterMaterialPlugin() function.
On 28/03/2008 at 06:24, xxxxxxxx wrote:
Yes, PLUGINFLAG_MATERIAL_GLIMAGE is set.
On 28/03/2008 at 06:26, xxxxxxxx wrote:
Hm, then I don't know what went wrong, it works fine here.
On 28/03/2008 at 06:27, xxxxxxxx wrote:
I will check if RenderDocument can be called in InitGLImage().
On 28/03/2008 at 06:28, xxxxxxxx wrote:
Here is working good.. except that alpha is stored in a Unknown place.
Renato
On 28/03/2008 at 06:59, xxxxxxxx wrote:
So is this now workng for you or do you still need some help? What you mean with unkown place?
On 28/03/2008 at 07:10, xxxxxxxx wrote:
i mean that i can't get the alpha channel from the bitmap passed in the renderdocumennt.
The RGB is correct and transferred to the 16bit image with setpixel, like you wrote... but nothing about alpha.
On 31/03/2008 at 05:22, xxxxxxxx wrote:
can you access the alpha at all?
On 31/03/2008 at 05:52, xxxxxxxx wrote:
No, i can't get the Alpha.. If i provide a BMP + Alpha to renderdocument.. the alpha is always empty.. this is my problem.
thanks renato
On 31/03/2008 at 06:18, xxxxxxxx wrote:
What does the document you send to RenderDocument()look like, just a plane with texture? Maybe you can provide a scene.
On 31/03/2008 at 06:47, xxxxxxxx wrote:
yes Matthias, it's a 4 point polygon with a light and camera.. just this.
www.danieleficini.com/temp/prova2.rar
On 31/03/2008 at 14:35, xxxxxxxx wrote:
Youhave to use a MultipassBitmap to access the Alpha of RenderDocument().
Here a working InitGLImage() function:
> \> Bool SimpleMaterial::InitGLImage(PluginMaterial \*mat, BaseDocument \*doc, BaseThread \*th, BaseBitmap \*bmp) \> { \> if(bmp) \> { \> LONG bw = bmp->GetBw(); \> LONG bh = bmp->GetBh(); \> \> MultipassBitmap \*tmp = MultipassBitmap::Alloc(bw,bh,MODE_RGB); \> if(!bmp) return FALSE; \> \> AutoAlloc<BaseDocument> rdoc; \> if(!rdoc) return FALSE; \> \> BaseObject \*plane = BaseObject::Alloc(Oplane); \> if(!plane) return FALSE; \> \> Material \*mat = Material::Alloc(); \> if(!mat) return FALSE; \> \> mat->SetChannelState(CHANNEL_ALPHA,TRUE); \> BaseChannel \*ch = mat->GetChannel(CHANNEL_ALPHA); \> \> BaseContainer cdata; \> cdata.SetLong(BASECHANNEL_SHADERID, 1001162); \> ch->SetData(cdata); \> \> rdoc->InsertMaterial(mat, NULL, FALSE); \> \> TextureTag \*ttag = TextureTag::Alloc(); \> if(!ttag) return FALSE; \> \> ttag->SetMaterial(mat); \> \> GeData d(TEXTURETAG_PROJECTION_UVW); \> ttag->SetParameter(DescLevel(TEXTURETAG_PROJECTION),d,NULL); \> \> plane->InsertTag(ttag, NULL); \> \> BaseContainer \*data = plane->GetDataInstance(); \> data->SetReal(PRIM_PLANE_WIDTH, 100.0); \> data->SetReal(PRIM_PLANE_HEIGHT, 100.0); \> data->SetLong(PRIM_PLANE_SUBW, 1); \> data->SetLong(PRIM_PLANE_SUBH, 1); \> \> rdoc->InsertObject(plane, NULL, NULL, FALSE); \> \> BaseObject \*camera = rdoc->GetRenderBaseDraw()->GetEditorCamera(); \> if(!camera) return FALSE; \> \> camera->SetPos(Vector(0.0,100.0,0.0)); \> camera->SetRot(Vector(0.0,-pi/2.0,0.0)); \> \> BaseContainer rdata = rdoc->GetActiveRenderData()->GetData(); \> rdata.SetLong(RDATA_XRES, bw); \> rdata.SetLong(RDATA_YRES, bh); \> rdata.SetBool(RDATA_ALPHACHANNEL, TRUE); \> rdata.SetLong(RDATA_ANTIALIASING, ANTI_BEST); \> \> if(RenderDocument(rdoc, rdata, NULL, NULL, tmp, RENDERFLAG_EXTERNAL, th) == RAY_OK) \> { \> LONG x,y; \> for(y=0; y<bh; y++) \> { \> for(x=0; x<bw; x++) \> { \> AlphaBitmap \*alpha = bmp->GetInternalChannel(); \> if(!alpha) alpha = bmp->AddChannel(TRUE,FALSE); \> \> UWORD value = 0; \> tmp->GetAlphaPixel(tmp->GetChannelNum(0),x,y,&value;); \> bmp->SetAlphaPixel(alpha,x,y,value); \> } \> } \> } \> \> MultipassBitmap::Free(tmp); \> } \> \> return TRUE; \> } \>
\> Bool SimpleMaterial::InitGLImage(PluginMaterial \*mat, BaseDocument \*doc, BaseThread \*th, BaseBitmap \*bmp) \> { \> if(bmp) \> { \> LONG bw = bmp->GetBw(); \> LONG bh = bmp->GetBh(); \> \> MultipassBitmap \*tmp = MultipassBitmap::Alloc(bw,bh,MODE_RGB); \> if(!bmp) return FALSE; \> \> AutoAlloc<BaseDocument> rdoc; \> if(!rdoc) return FALSE; \> \> BaseObject \*plane = BaseObject::Alloc(Oplane); \> if(!plane) return FALSE; \> \> Material \*mat = Material::Alloc(); \> if(!mat) return FALSE; \> \> mat->SetChannelState(CHANNEL_ALPHA,TRUE); \> BaseChannel \*ch = mat->GetChannel(CHANNEL_ALPHA); \> \> BaseContainer cdata; \> cdata.SetLong(BASECHANNEL_SHADERID, 1001162); \> ch->SetData(cdata); \> \> rdoc->InsertMaterial(mat, NULL, FALSE); \> \> TextureTag \*ttag = TextureTag::Alloc(); \> if(!ttag) return FALSE; \> \> ttag->SetMaterial(mat); \> \> GeData d(TEXTURETAG_PROJECTION_UVW); \> ttag->SetParameter(DescLevel(TEXTURETAG_PROJECTION),d,NULL); \> \> plane->InsertTag(ttag, NULL); \> \> BaseContainer \*data = plane->GetDataInstance(); \> data->SetReal(PRIM_PLANE_WIDTH, 100.0); \> data->SetReal(PRIM_PLANE_HEIGHT, 100.0); \> data->SetLong(PRIM_PLANE_SUBW, 1); \> data->SetLong(PRIM_PLANE_SUBH, 1); \> \> rdoc->InsertObject(plane, NULL, NULL, FALSE); \> \> BaseObject \*camera = rdoc->GetRenderBaseDraw()->GetEditorCamera(); \> if(!camera) return FALSE; \> \> camera->SetPos(Vector(0.0,100.0,0.0)); \> camera->SetRot(Vector(0.0,-pi/2.0,0.0)); \> \> BaseContainer rdata = rdoc->GetActiveRenderData()->GetData(); \> rdata.SetLong(RDATA_XRES, bw); \> rdata.SetLong(RDATA_YRES, bh); \> rdata.SetBool(RDATA_ALPHACHANNEL, TRUE); \> rdata.SetLong(RDATA_ANTIALIASING, ANTI_BEST); \> \> if(RenderDocument(rdoc, rdata, NULL, NULL, tmp, RENDERFLAG_EXTERNAL, th) == RAY_OK) \> { \> LONG x,y; \> for(y=0; y<bh; y++) \> { \> for(x=0; x<bw; x++) \> { \> AlphaBitmap \*alpha = bmp->GetInternalChannel(); \> if(!alpha) alpha = bmp->AddChannel(TRUE,FALSE); \> \> UWORD value = 0; \> tmp->GetAlphaPixel(tmp->GetChannelNum(0),x,y,&value;); \> bmp->SetAlphaPixel(alpha,x,y,value); \> } \> } \> } \> \> MultipassBitmap::Free(tmp); \> } \> \> return TRUE; \> } \>
On 01/04/2008 at 07:22, xxxxxxxx wrote:
i'm sorry but tmp->GetChannelNum(0)
always return 0x00000000...
any suggestion?