Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Can someone please compile a bone in c++?

    SDK Help
    0
    5
    605
    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
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 07/10/2005 at 06:40, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   9.102 
      Platform:   Windows  ;   
      Language(s) :   C.O.F.F.E.E  ;   XPRESSO  ;

      ---------
      I have a coffee tag plugin that distort a the object where it is placed, based on the matrix of a lot of Null objects that work like body parts. I think it is better than c4d bones, but the result takes about 12 seconds to calculate each redraw, so I think that a c++ deformer object could be far better. My problem is that I don´t understand howw c++ works exactly, and i don´t know how to get a cdl or xdl file.
      I´ll post here the code for everyone later. Can someone transform it to c++ and compile it (for free, of course)?

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

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 08/10/2005 at 05:35, xxxxxxxx wrote:

        12 seconds seems a bit much, even in coffee. Perhaps you could do with some optimizations?

        What plans do you have for your plugin? Are you planning on making it free/commercial/open source?

        To convert your code into a cdl/xdl file you will need a compiler such as Microsoft Visual Studio. VS will only compile into a .cdl file, so it would only work for PC

        To compile your code into a .xdl file you need a piece of software called Code Warrior, which can compile into a Mac compatible plugin.

        Of course, this will only work if you first convert your coffee code into c++ code, of course this would require experience of c++.

        Any chance you could show us any videos or images of the plugin in action?

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

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 09/10/2005 at 03:56, xxxxxxxx wrote:

          Thank you for reply. Here you have my code for my tag:
          /////////////////////////////////////////////////////////////////////////////
          var TagName="Bonify";
          var TagHelp="";
          class MyExpressionPluginTag : ExpressionPluginTag
          {public:
          MyExpressionPluginTag();
          GetID();
          MultipleAllowed();
          DisplayAllowed();
          GetIcon();
          GetHelpText();
          UseMenu();
          GetName();
          Edit();
          Message(type, data);//I don´t know very well how to
          //use this.Perhaps I could make it faster there.
          Execute(doc, op);
          Speedup(doc, op);
          }
          MyExpressionPluginTag::MyExpressionPluginTag() {super();}
          MyExpressionPluginTag::GetID() {return PluginID;}
          MyExpressionPluginTag::MultipleAllowed() {return FALSE;}
          MyExpressionPluginTag::DisplayAllowed() {return TRUE;}
          MyExpressionPluginTag::GetIcon() { /*code for load a bitmap*/}
          MyExpressionPluginTag::GetHelpText() {return TagHelp ;}
          MyExpressionPluginTag::UseMenu() {return TRUE;}
          MyExpressionPluginTag::GetName() {return TagName;}
          MyExpressionPluginTag::Edit(){/*code for settings dialog*/}
          MyExpressionPluginTag::Message(type, data){}
          MyExpressionPluginTag::Execute(doc, op)
          {
          //this is just for facilities in work
          if((op#ID_BASEOBJECT_VISIBILITY_EDITOR==1) || (op#ID_BASEOBJECT_VISIBILITY_RENDER==1) )return;
          //the number of points we are working with
          var count=op->GetPointCount();
          var opdef;/*an object with the same points before
          been deformed. I know this will not be necessary with
          a deformer in c++.*/
          //I store it in a user data
          try { opdef=op#ID_USERDATA:1;}catch(ExLastException) { Edit();return FALSE;}
          // now i´ll find a "bone" for each vertexmap of the object.
          /*first, I had the expressiontag in each "bone", but this is faster, at least in coffee*/
          var t=op->GetFirstTag();
          while(t)
          {var wei,bon,miklo,trans=0,v,v0,i=0;
          if(t->GetType()==Tvertexmap)
          {
          wei=t->GetData();/*the values for mixing the default point with the deformed one*/
          /*This is how I store the "bones" and their relation to vertexmaps. In c++ you could do it with node data or whatever for the attributes manager*/
          try{ bon=t#ID_USERDATA:1; if(!bon){bon=doc->FindObject(t#ID_BASELIST_NAME);t#ID_USERDATA:1=bon; } }
          catch(ExLastException) { bon=doc->FindObject(t#ID_BASELIST_NAME);}
          if(!bon){TextDialog(t#ID_BASELIST_NAME+"?");}
           
          miklo=bon->GetMg();//global matrix of the "bone"
          /*This is my code for finding the true relative point of rotation of the "bone". perhaps you have a faster way?*/
          while(bon){ trans+=bon#ID_BASEOBJECT_POSITION;
          bon=bon->GetUp();}
          gc();//I don´t know really if it is necessary
          while(i<count)
          {
          if(wei[i]!=0)//I skip the points not afected
          {
          v0=opdef->GetPoint(i);
          v=miklo->GetMulP(v0-trans);/*This is really my "innovation" 🙂 */
          v=Mix(v0,v,wei[i]);
          op->SetPoint(i,v);
          }
          i++;
          }
          op->MultiMessage(MSG_UPDATE);
          }
          t=t->GetNext();
          }
          }
          MyExpressionPluginTag::Speedup(doc, op){if(op) Touch(op); return TRUE;}
          main(){Register(MyExpressionPluginTag);}
          ///////////////////////////////////////////////////////////////////
           
           
          I know a little about c++. I have the sdk, and I have a free compiler found in www.bloodshed.net .But I don´t know how to use it for c4d.
          This takes 12 seconds with a figure of about 3000 points.
          With a figure of about 300 points you can work right, even in coffee.
           
          Of couse, It will be a free, open source plugin (here you have the code). I will try to put it in a c++ pseudocode for an object plugin later. But i think now you can imagine what i want.

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

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 09/10/2005 at 08:30, xxxxxxxx wrote:

            The only compilers that currently work with the SDK are Microsoft Visual C++ and CodeWarrior. I think that there is a free version of VC++ which you can use for non-commercial work, but don't remember the specifics.

            Victoria 3 has 72712 points and, yikes, Miki has 115067! It needs to be tight code.

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

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 09/10/2005 at 09:41, xxxxxxxx wrote:

              Hi Robert! I wanted to talk with you! So it´s easily tofind you here that in your own forum?
              I was wrong with my estimation in points. I didn´t want to talk in Poser´s things beacause perhaps someone didn´t know it's figures. My "12 seconds" were measured woking  : ) !  with Victoria 3. But with the P3 woman, it takes faster and you can work right, even with coffee. The result its very near to Poser's way. I haven´t got "miki", but I yhink in most projects you don´t need so much points, an hypernurbs could do a good thing. I will try now an option to import vertexmaps exported with a python, like I told you in the e-mail.
              I think the problem in my code is that I have several iteractions, especially in taking the points from the deformed object and the default one. This is twice the work that a c++ deformer would do, taking into acount that c4d owns the default point and "projects" the deformed one. Perhaps in c++ it is faster to get the code in several objects (like the deafaul c4d bone) instead of one deformer that collects the position of other objects, like i currently do.
              This way, the object could store his relative position (wich I get with: while(bon){ trans+=bon#ID_BASEOBJECT_POSITION;bon=bon->GetUp();}) before readding the points to deform. and the relation to vertexmaps could be done in c4d´s way with restrictiontags, or with a link in the attributes manager, or even with claude bonet tags, if it accepts to be linken to the new boneobject.
               
              ¿are you sure Bloodshed Dev C++ does not compile c4d files? It can import Visual Studio proyects and it say it works in the same way. I don´t know why, I have a problem to install Visual Studio. I will try again, but it would be better if someone experienced in c++ help me.
              It would be great if Robert or someone else, especially someone who owns poser figures, try my tag. It is easy: you just have to put it on the mesh and rename some objects with bodypat names. It is easy to do a code to transform polyselections to vertexmaps very fast; I suppose you can do it in a few minutes, but I will post it later for everyone. then i have another code to create a null object that rèpresent each body part. then You select all the vertexmaps in your mesh, Add User Data - Link, and run my tag.
              In the future I will do a code to automatically put the "bone" objects in Poser´s center of rotation, now I do that manually.  It don´t have to be perfect to sea the results, and it´s like tweaking with the JointEditor, very easy.
              Finally, you can rotate this objects and the mesh moves ok 🙂 .
              I think with this corrections in c++, it can work good withot changing the main code.
               
              The main idea is :
              === First, getting the "virtual translation" adding the translations of all
                                   the parents of the current calculated deformer,and putting it as
                                   V0 of it´s global Matrix, getting the matrix Mnew, and the vector Vnew;
              ===Second, deforming each point this way: 
                                   deformed_point=Mnew->GetMulP(default_point-Vnew);
               
               
              I will try to post some images or video or c4d scene, but I think I have explained well...
              Thank you for your attention and replies. I hope you like my idea.

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