Create Array for Vertexmap?
-
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
-
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.
-
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?
-
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
-
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
-
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
-
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
-
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!