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 21/01/2010 at 01:41, xxxxxxxx wrote:
User Information: Cinema 4D Version: 11.5 Platform: Windows ; Mac OSX ; Language(s) : C++ ;
--------- Hello all, in my material plugin i need to substitute standard material preview with a simple bitmap, any way to do this ? Thanks in advance franz
On 21/01/2010 at 02:13, xxxxxxxx wrote:
Please check the MATPREVIEW_ messages in the documentation and the particlevolume.cpp and simplematerial.cpp SDK example files. These two plugin materials replace the the standard material with a custom preview scene.
cheers, Matthias
On 22/01/2010 at 06:19, xxxxxxxx wrote:
Hello Matthias, thanks i found some interesting thisngs in the examples: i have some problem to add a bitmap in material here my complete message for preview generation : Bool TheaMaterial::Message(GeListNode* node, LONG type, void* data) { if (type == MSG_UPDATE) updatecount++;
switch (type) { case MSG_EDIT: { //my material stuff break; }
case MATPREVIEW_GET_OBJECT_INFO: // the preview needs our object information {
MatPreviewObjectInfo* info = (MatPreviewObjectInfo* )data; info->bHandlePreview = TRUE; // own preview handling info->bNeedsOwnScene = TRUE; // we need our own entry in the preview scene cache info->bNoStandardScene = TRUE; // create our own preview scene info->lFlags = MATPREVIEW_FLAG_HIDE_SCENE_SETTINGS; // hide the scene settings entry return TRUE; } break; case MATPREVIEW_MODIFY_CACHE_SCENE: { MatPreviewModifyCacheScene* scene = (MatPreviewModifyCacheScene* )data; BaseObject * back = BaseObject::Alloc(Obackground); if (!back) return FALSE; back->SetName("back"); BaseTag* mattag = back->MakeTag(Ttexture); if (!mattag) return FALSE; scene->pDoc->InsertObject(back, NULL, NULL); return TRUE; } break; case MATPREVIEW_PREPARE_SCENE: { MatPreviewPrepareScene* preparescene = (MatPreviewPrepareScene* )data;
BaseMaterial *matclone = BaseMaterial::Alloc(Mmaterial);
AutoAlloc<AliasTrans> trans; if (!trans) return FALSE; if (!trans->Init(GetActiveDocument())) return FALSE;
Filename mypreview; mypreview.SetString("tempprev.jpg"); BaseBitmap * bitprev = BaseBitmap::Alloc(); LONG test = bitprev->Init(mypreview,-1,0); if ( test != IMAGE_OK) GePrint ("error");
PluginShader *shd = NULL; shd = PluginShader::Alloc(Xbitmap); if(!shd) return FALSE;
BaseContainer *shddata = shd->GetDataInstance(); BaseContainer * matdata = matclone->GetDataInstance();
matdata->SetLink(MATERIAL_COLOR_SHADER, shd); matclone->InsertShader(shd, NULL);
shddata->SetFilename(BITMAPSHADER_FILENAME, "mypreview"); shd->Message(MSG_UPDATE); matclone->Message(MSG_UPDATE); matclone->Update(TRUE, FALSE); EventAdd();
BaseMaterial* matclone2 = (BaseMaterial* )(matclone->GetClone(0, trans));
preparescene->pDoc->InsertMaterial(matclone2);
if (preparescene->pLink) preparescene->pLink->SetLink(matclone2); // necessary
BaseObject* back = preparescene->pDoc->SearchObject("back"); if (back) { TextureTag* textag = (TextureTag* )back->GetTag(Ttexture); if (textag) textag->SetMaterial(matclone2); }
preparescene->bScenePrepared = TRUE; return TRUE; } break; case MATPREVIEW_GET_POPUP_OPTIONS: { return TRUE; } break; case MATPREVIEW_HANDLE_POPUP_MSG: { return TRUE; } break; case MATPREVIEW_GENERATE_IMAGE: { MatPreviewGenerateImage* image = (MatPreviewGenerateImage* )data; if (!image->bEditorPreview) { if (image->pDoc) { LONG w = image->pDest->GetBw(); LONG h = image->pDest->GetBh(); BaseContainer bcRender = image->pDoc->GetActiveRenderData()->GetData(); bcRender.SetReal(RDATA_XRES, w); bcRender.SetReal(RDATA_YRES, h); bcRender.SetLong(RDATA_ANTIALIASING, ANTI_GEOMETRY);
image->pDest->Clear(0, 0, 0); image->lResult = RenderDocument(image->pDoc, bcRender, NULL, NULL, image->pDest, RENDERFLAG_EXTERNAL | RENDERFLAG_PREVIEWRENDER, image->pThread); } } return TRUE; } break;
} return MaterialData::Message(node, type, data); }
i tried colors and various parameter of material work fine... textuore shader don't work any sugestion ? Franz
On 26/01/2010 at 07:01, xxxxxxxx wrote:
no news ? Franz
On 27/01/2010 at 06:24, xxxxxxxx wrote:
Still working on it. I post again if I've found a solution.
On 04/02/2010 at 05:30, xxxxxxxx wrote:
one more question, is this a static background image or does it have to be updated by the material?
On 04/02/2010 at 05:43, xxxxxxxx wrote:
i am working on an external renderer exporter, after material editing (in a external application material editor) i can save the image in a file then i'dd like to load it in cinema material preview. franz
On 04/02/2010 at 12:35, xxxxxxxx wrote:
For just displaying an image it's probably easier to directly modify the displayed bitmap. You can do this in MATPREVIEW_GENERATE_IMAGE. Instead of rendering the preview document simply fill the preview bitmap. This will react to changes made in the AM too. Here is some example code:
Bool ParticleVolume::Message(GeListNode *node, LONG type, void *data) { switch (type) { case MATPREVIEW_GET_OBJECT_INFO: { MatPreviewObjectInfo* info = (MatPreviewObjectInfo* )data; info->bHandlePreview = TRUE; // own preview handling info->bNeedsOwnScene = TRUE; // we need our own entry in the preview scene cache info->bNoStandardScene = TRUE; // create our own preview scene info->lFlags = MATPREVIEW_FLAG_HIDE_SCENE_SETTINGS; // hide the scene settings entry return TRUE; } break; case MATPREVIEW_MODIFY_CACHE_SCENE: { return TRUE; } break; case MATPREVIEW_PREPARE_SCENE: { MatPreviewPrepareScene* preparescene = (MatPreviewPrepareScene* )data; AutoAlloc<AliasTrans> trans; if (!trans) return FALSE; if (!trans->Init(GetActiveDocument())) return FALSE; BaseMaterial* matclone = (BaseMaterial* )(Get()->GetClone(0, trans)); preparescene->pDoc->InsertMaterial(matclone); trans->Translate(TRUE); if (preparescene->pLink) preparescene->pLink->SetLink(matclone); preparescene->bScenePrepared = TRUE; return TRUE; } break; case MATPREVIEW_GENERATE_IMAGE: { MatPreviewGenerateImage* image = (MatPreviewGenerateImage* )data; if (image->pDoc) { if (!image->bEditorPreview) { AutoAlloc<BaseBitmap> bmp; if (!bmp || bmp->Init(Filename("C:\\test.jpg")) != IMAGE_OK) return FALSE; bmp->ScaleIt(image->pDest, 256, TRUE, TRUE); image->lResult = RAY_OK; } } return TRUE; } break; } return MaterialData::Message(node, type, data); }
hope this helps
On 04/02/2010 at 13:40, xxxxxxxx wrote:
Thanks Matthias, i'll try this! As usual your help is invaluable. Franz