Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    how to modify the code to display bitmap

    Scheduled Pinned Locked Moved SDK Help
    2 Posts 0 Posters 267 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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!");
      }

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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
          };

        1 Reply Last reply Reply Quote 0
        • First post
          Last post