how to modify the code to display bitmap
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 22/07/2007 at 01:52, xxxxxxxx wrote:
User Information:
Cinema 4D Version:
Platform:
Language(s) : C.O.F.F.E.E ; C++ ; XPRESSO ;---------
I want to render the object and display the progress with model. but I have an little problem that can't implement display the progress. since I am an newcome student about c4d, how can I to modify the code section :
AddUserArea( PREVIEW_AREA_ID, 0, m_bmp->GetBw(), m_bmp->GetBh());
AttachImage(PREVIEW_AREA_ID, m_bmp, 0);
this is my all code modifly after :
#ifndef __RENDER__COMMON__H
#define __RENDER__COMMON__H
#include "c4d.h"
#include "c4d_symbols.h"
#include "c4d_general.h"
#include "c4d_baseobject.h"
class PreviewAreaBmp : public GeUserArea
{
public:
AutoAlloc<BaseBitmap> m_pBmp;
public: // we only need to overload a few functions...
Bool Init(void)
{
BaseDocument* doc = GetActiveDocument();
BaseContainer rdata = doc->GetActiveRenderData()->GetData();
// initialize the bitmap
if( !m_pBmp || m_pBmp->Init( rdata.GetLong(RDATA_XRES), rdata.GetLong(RDATA_YRES) )!=IMAGE_OK )
{
return false;
}
return true;
}virtual Bool Init(LONG x, LONG y, LONG depth = 24)
{
// initialize the bitmap
BaseDocument* doc = GetActiveDocument();
BaseContainer rdata = doc->GetActiveRenderData()->GetData();
if( !m_pBmp || m_pBmp->Init( x, y,depth ) != IMAGE_OK )
return false;
return true;
}virtual void Draw(LONG x1, LONG y1, LONG x2, LONG y2, LONG flag = 0 )
{
// if we have a valid bitmap, render it into the specified region
if( m_pBmp )
{
DrawBitmap( m_pBmp, x1, y1, x2-x1, y2-y1, 0, 0, m_pBmp->GetBw(), m_pBmp->GetBh(), BMP_NORMALSCALED | BMP_ALLOWALPHA );
}
this->Redraw( TRUE);
}
virtual BaseBitmap* GetBitMap()
{
BaseBitmap* bmp = NULL;
m_pBmp->CopyTo( bmp );
return bmp;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////
class ModalRenderer : private GeModalDialog
{
private:
BaseDocument* m_doc;
BaseContainer m_rdata;
String m_title;
Bool m_showerrors;
PreviewAreaBmp m_bmparea;
Real m_p;
LONG m_result;
enum
{
SCROLL_GROUP_ID = 100000,
PREVIEW_AREA_ID,
DLGGROUP_ID,
MAIN_GROUP_ID
};
class RenderThread : public Thread
{
private:
ModalRenderer* m_dlg;
public:
RenderThread(ModalRenderer* dlg) : m_dlg(dlg) {}
virtual ~RenderThread() { m_dlg = NULL; End(); Wait(FALSE); }
virtual void Main()
{
if (!m_dlg) return;
// Start render
/*MessageDialog("SETP_ ThreadMain()!");*/
LONG result =
RenderDocument( m_dlg->m_doc,
m_dlg->m_rdata,
ProgressFunction,
m_dlg,
m_dlg->m_bmparea.m_pBmp,
m_dlg->m_showerrors,
(BaseThread* )this->Get());
if (m_dlg)
{
m_dlg->m_result = result;
}
}
virtual const CHAR *GetThreadName(void)
{
char szThreadName[128]= {0};
char *p = NULL;
//GET THREAD NAME
//RETURN
p = szThreadName;
return p;
}
private:
// Called by RenderDocument now and then
static void ProgressFunction(Real p, void* dlg)
{
static_cast<ModalRenderer*>(dlg)->m_p = p;
}
} m_rt;
friend class RenderThread;
public:
ModalRenderer() :
m_doc(NULL),
m_p(0.0),
m_result(NOTOK),
m_showerrors(TRUE),
m_rt(this) { }
virtual ~ModalRenderer()
{
ShutdownThread();
}
// Render document 'doc' with settings 'rdata',
// displaying a progress windows with 'title' and
// optionally not showing error messages.
Bool Render(BaseDocument* doc, const BaseContainer& rdata,
const String& title = String(), Bool showerrors = TRUE)
{
if (!doc) return FALSE;
if ( m_rt.IsRunning() )
{
return FALSE;
}
m_doc = doc;
m_rdata = rdata;
m_title = title;
m_showerrors = showerrors;
Bool success = Open();
ShutdownThread();
return success && GetResult();
}
//----------------------------------------------------------------------------------------------------
private:
// Build the dialog
virtual Bool CreateLayout()
{
if (!InitBitmap()) return FALSE;
SetTitle(m_title);
GroupBegin(MAIN_GROUP_ID, BFV_SCALEFIT | BFH_SCALEFIT, 1, 0, "", 0);
{
GroupSpace(4,4);
ScrollGroupBegin(SCROLL_GROUP_ID, BFV_SCALEFIT | BFH_SCALEFIT,
SCROLLGROUP_STATUSBAR | SCROLLGROUP_BORDERIN |
SCROLLGROUP_NOBLIT);
{
//@@@@@@@@ at here is my modify,
// I have been added to class PreviewAreaBmp
//but is fail from test@@@@@@@@@@@@*///AddUserArea( PREVIEW_AREA_ID, 0, m_bmp->GetBw(), m_bmp->GetBh());
//AttachImage(PREVIEW_AREA_ID, m_bmp, 0);AddUserArea( PREVIEW_AREA_ID, 0, m_bmparea.m_pBmp->GetBw(), m_bmparea.m_pBmp->GetBh());
AttachUserArea( m_bmparea, PREVIEW_AREA_ID);
}
GroupEnd();
AddDlgGroup(DLG_CANCEL);
}
GroupEnd();
return TRUE;
}
// Init dialog and start render
virtual Bool InitValues()
{
UpdatePreview();
SetTimer(500);
Bool success = TRUE;
if (!m_rt.IsRunning())
{
success = m_rt.Start(TRUE);
}
return success;
}
// Ask if the render is running
virtual Bool AskClose()
{
if (!m_rt.IsRunning()) return FALSE;
return !QuestionDialog("Do you really want to abort the rendering?");
}
// Deal with close box and cancel button problems
virtual LONG Message(const BaseContainer &msg, BaseContainer &result)
{
// Workaround for bad base class implementation
if (msg.GetId() == BFM_ACTION &&
msg.GetLong(BFM_ACTION_ID) == IDC_CANCEL)
{
return Command(IDC_CANCEL, msg);
}
else if (msg.GetId() == BFM_CHECKCLOSE)
{
return AskClose();
}
else
{
return GeModalDialog::Message(msg,result);
}
}
// Check for cancel button
virtual Bool Command(LONG id, const BaseContainer& msg)
{
if (id == IDC_CANCEL && !AskClose())
{
ShutdownThread();
return Close(FALSE);
}
return FALSE;
}
// Run every 500 ms...
virtual void Timer(const BaseContainer& msg)
{
UpdatePreview();
UpdateStatus();
CheckFinished();
}// Create preview bitmap
Bool InitBitmap()
{
m_bmparea.Init( m_rdata.GetLong(RDATA_XRES), m_rdata.GetLong(RDATA_YRES) );
return true;
}
// Tell the preview to redraw itself
void UpdatePreview()
{
//GetUserArea is error from compile
/*GeUserArea* ua = GetUserArea(PREVIEW_AREA_ID);*/
//if (ua) ua->Redraw(TRUE);
m_bmparea.Draw( 0, 0, m_rdata.GetLong(RDATA_XRES), m_rdata.GetLong(RDATA_YRES) );
//m_bmparea.Redraw( TRUE );
}
// Set new statusline text
void UpdateStatus()
{
String txt;
if (m_p != 1.0)
{
txt = "Rendering: " + LongToString(m_p * 100) + "%";
}
else
{
txt = "Finished!";
}
BaseContainer msg(BFM_SETSTATUSBAR);
msg.SetLong(BFM_STATUSBAR_PROGRESSON, TRUE);
msg.SetString(BFM_STATUSBAR_TXT, txt);
msg.SetReal(BFM_STATUSBAR_PROGRESS, m_p);
SendMessage(SCROLL_GROUP_ID, msg);
}
// Wait until render thread is stopped
void ShutdownThread()
{
m_rt.End();
m_rt.Wait(FALSE);
}
// Check if the render is finished
void CheckFinished()
{
if (!m_rt.IsRunning())
{
Close(m_result == RAY_OK);
}
}// Internal class with render thread
// So that the internal class can access private variables
};
#endif
///////////////////////////////////////////////////////////////////////////////////////////////
void ModulRender()
{
BaseDocument* doc = GetActiveDocument();
BaseObject* null = doc->GetActiveObject();
if (!null) return;
BaseContainer rdata = doc->GetActiveRenderData()->GetData();
BaseBitmap* bmp = BaseBitmap::Alloc();
bmp->Init(rdata.GetLong(RDATA_XRES),
rdata.GetLong(RDATA_YRES));
RenderDocument(doc, rdata, NULL , NULL, bmp, TRUE , NULL);
bmp->Save( GeGetStartupPath() + "test_modul.jpg", FILTER_JPG, NULL, SAVEBIT_32b*tchANNELS);
ShowBitmap(bmp);
BaseBitmap::Free( bmp );
ModalRenderer mr;
Bool success = mr.Render(doc, rdata, null->GetName(), TRUE);
MessageDialog("Finish!");
} -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 22/07/2007 at 02:00, xxxxxxxx wrote:
note: the originality data like this. from https://developers.maxon.net/forum/topic/1320
private:
BaseDocument* m_doc;
BaseContainer m_rdata;
String m_title;
BaseBitmap* m_bmp;
Bool m_showerrors;
Real m_p;
LONG m_result;
enum
{
SCROLL_GROUP_ID = 100000,
PREVIEW_AREA_ID,
DLGGROUP_ID,
MAIN_GROUP_ID
};