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
    • Recent
    • Tags
    • Users
    • Login

    Create Array for Vertexmap?

    Scheduled Pinned Locked Moved SDK Help
    8 Posts 0 Posters 484 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 18/08/2009 at 15:17, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   10.1+11 
      Platform:   Windows  ; Mac  ;  
      Language(s) :     C++  ;

      ---------
      Hi,

      maybe a very basic question, but here it is anyway:

      I want to store a lot of values (real, between 0..1) in an array, and write that array to a vertex map (VariableTag).

      The VariableTag has a method "void* GetDataAddressW(void)", which can be casted into an array of Real pointers. Can I somehow create a similar array myself and copy it into the VariableTag's array if needed?

      Thanks in advance for help!

      Cheers,
      Jack

      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 18/08/2009 at 15:45, xxxxxxxx wrote:

        When you get the data address for writing, simply write your array values to the data address array. It is just a pointer to the VertexMap tag's actual array.

        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 19/08/2009 at 06:10, xxxxxxxx wrote:

          I know, but that would mean to allocate the tag first. Since allocatoin costs time, I only want to do this if it's necessary.

          Is there now way to prepare the array and only allocate the tage & copy the data into it, when required?

          Since I will have to do this with several tags and quite large numbers of vertices, I am afraid it would decrease the performance too much. Or is allocation of a tag & filling the data into it not that slow?

          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 19/08/2009 at 06:17, xxxxxxxx wrote:

            I am not sure I understand the question. If it is just about the array allocation, that would be something like this:

            > \> Real \*buffer = (Real\* )GeAlloc(length\*sizeof(Real)); //length == length of the array \> \> //do something \> \> GeFree(buffer); \>

            cheers,
            Matthias

            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/08/2009 at 16:42, xxxxxxxx wrote:

              Ah, that sounds reasonable 🙂

              And this array can be copied into the Vertexmap's Data array, if needed?

              Thanks!

              Greetings,
              Jack

              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 26/01/2010 at 18:40, xxxxxxxx wrote:

                I'm having a horrible time trying to generate a Tvertexmap tag and fill it with an array. I seem to be able to make the tag just fine useing maketag or the Allocation below, but actually populating it with data... I'm just moving over from COFFEE to C++ and have no solid idea how to construct an array from scratch in C++ nor of how to point the tag to the correct address... I'm also not sure if I need to Free any of the junk I create in a case like this since C4D should take over ownership of the tag... If I'm building the array by parsing an external file, will I need to Free() that array once the vertexmap tag gets put into the document? Here is what I've tried so far- I can make the tag, but I can't seem to access the data- I've left a couple of attempts in the code below:

                static VariableTag*vMtag = VariableTag::Alloc(Tvertexmap, 20); // the 20 seems to have no effect there are no points in the vertex map of the structure manager
                                //pCombX=(Real* )vMtag->GetDataAddressW(); // this seems to point to a read-only array
                                const void *dataptr = vMtag->GetDataAddressW(); // This was a read-only array in the PluginCafePost I swiped it from
                                dataptr[3] = 179; // this says I'm trying to do arithmatic on a void
                               // VariableTag *vMtag = VariableTag::Alloc( Tvertexmap );
                                vMtag->SetName("gGreen"); // this works great!
                                objCellMembrane->InsertTag(vMtag, NULL); // this works great too
                                GePrint("pCombx 21: " + RealToString(pCombX[21]) );// this prints pCombx21: 0"
                                GePrint("pCombx 3: " + RealToString(pCombX[3]) ); // this prints pCombx3: 0"
                                doc->AddUndo( UNDO_NEW, vMtag ); // would I need to free anything after this?
                Thanks,
                G

                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 27/01/2010 at 06:54, xxxxxxxx wrote:

                  Here is a simple example how to create and fill a vertex map tag. The code should be pretty much self explainatory.

                    
                  Bool MenuTest::Execute(BaseDocument *doc)  
                  {  
                    StopAllThreads();  
                    
                    //get active object and check if it is a polygon object  
                    BaseObject *op = doc->GetActiveObject();  
                    if (!op || op->GetType() != Opolygon) return FALSE;  
                    
                    //get the object's vertex (point) count  
                    LONG pcnt = ToPoly(op)->GetPointCount();  
                    
                    //create the vertex map tag.  
                    VariableTag *vtag = (VariableTag* )op->MakeVariableTag(Tvertexmap, pcnt, NULL);  
                    if (!vtag) return FALSE;  
                    
                    op->Message(MSG_UPDATE);  
                    
                    //get the vertex map tag's size (should be same as vertex (point) count  
                    LONG vcnt = vtag->GetDataCount();  
                    //get the pointer to the vertex map array  
                    Real *vmap = (Real* )vtag->GetDataAddressW();  
                    
                    //random class to fill vertex map with random values, just to show how to fill the vertex map  
                    Random rnd;  
                    rnd.Init(46346);  
                    
                    //fill the vertex map with random values  
                    if (vmap)  
                    {  
                        for (LONG i=0; i<vcnt; i++)  
                        {  
                            vmap[i] = rnd.Get01();  
                        }  
                    }  
                    
                    vtag->Message(MSG_UPDATE);  
                    
                    EventAdd();  
                    
                    return TRUE;  
                  }  
                  

                  cheers,
                  Matthias

                  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 28/01/2010 at 10:03, xxxxxxxx wrote:

                    Perfect Matthias- I learned a lot from this and got it up and running right away. Thank you very much!

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