|
IRdNumArray
About Truespace Archives
These pages are a copy of the official truespace forums prior to their removal somewhere around 2011.
They are retained here for archive purposes only.
IRdNumArray // SDK, Plug-in & 3rd Party Area
Post by Paul_Martinsen // Mar 6, 2009, 8:00pm
Paul_Martinsen
Total Posts: 5
|
Hello,
I used the cable object as the basis for a tentacle animation recently and converted it to C++ to make it run faster (I had a lot of tentacles). I've been trying to make it easier to use so I can share it with everyone but have run into a problem.
I store the position of the tentacle in a 3D "Common Data Package/Number Array Data" object. This comes across as an IRdNumArray object in C++. The array is 120 x 20 x 3 (key frames x segments x <x,y,z>).
To access the data in the array, I package the matrix index into a safe array (VT_I4) then call GetAt as follows:
if (FAILED(SetIndicies(psaIndex, nKey1, nStep, nAxis)) ||
FAILED(hr = pData->GetAt(psaIndex, &vResult)) ||
FAILED(vResult.ChangeType(VT_R4)))
{ SafeArrayDestroy(psaIndex);
return;
}
When nKey1 == nStep == nAxis == 0, this works fine. But if I set nAxis to 1, I get an E_INVALIDARG from GetAt(...). I've used GetDim() & GetSize() earlier in the code to check that the size of the array is as expected & the access works from a TS JScript object.
I'd be grateful if anyone can suggest a solution or has an example for accessing multidimensional TrueSpace arrays. The only alternative I can think of is putting the data in a text file, tying the project to the file system.
Thanks
Paul. |
Post by frootee // Mar 7, 2009, 3:51am
frootee
Total Posts: 2667
|
Hello,
To access the data in the array, I package the matrix index into a safe array (VT_I4) then call GetAt as follows:
if (FAILED(SetIndicies(psaIndex, nKey1, nStep, nAxis)) ||
FAILED(hr = pData->GetAt(psaIndex, &vResult)) ||
FAILED(vResult.ChangeType(VT_R4)))
{ SafeArrayDestroy(psaIndex);
return;
}
When nKey1 == nStep == nAxis == 0, this works fine. But if I set nAxis to 1, I get an E_INVALIDARG from GetAt(...). I've used GetDim() & GetSize() earlier in the code to check that the size of the array is as expected & the access works from a TS JScript object.
Thanks
Paul.
Hi Paul.
You have a 3 dimensional array, but are trying to access its contents using a single index.
While with 'classic' array structures you can get away with it, like this:
int x[5][10];
printf("%d", x[35]);
with the GetAt function, you have to use an index for each dimension.
Here's some sample jscript code to demonstrate what I mean:
// Execute
// Called to execute the command
function Execute(params)
{
arr = System.CreateDO('Common Data Package/Number Array Data');
arr.SetDim(3);
arr.SetSize(5, 10, 15);
arr.SetAt(4, 9, 14, 100);
arr.SetAt(0, 9, 0, 10);
// This works
val = arr.GetAt(4, 9, 14);
// This does not work
val2 = arr.GetAt(10);
System.Alert(val2);
}
Try that and please let us know how it goes. Thanks! :)
Froo |
Post by Paul_Martinsen // Mar 7, 2009, 11:24am
Paul_Martinsen
Total Posts: 5
|
Thanks Froo.
I should have pointed out the code example was in C++. C++ doesn't support variable arguments for COM calls so instead of specifying the indicies as separate arguments, they are packed into a "safe array". In other words, psaIndex is a 3 element array that contains the 3 indicies for the matrix.
What I can't understand is why vResult = array.GetAt(0,0,1) works in TS, but array->GetAt({0,0,1},&vResult) fails in C++. :-(
paul. |
Post by jamesmc // Mar 8, 2009, 5:56am
jamesmc
Total Posts: 2566
|
Just a S.W.A.G. and pardon me for butting in, but if the positions are non-linear (negative or values outside of a known matrix) the dimensioning might fail if consideration was not given how to handle negative position values.
i.e. pointers to something outside of an array not defined by a Class that handles 'out of range' actions or where the definition doesn't consider that some positive element tries to be smaller than a negative number, which it can not be.
As I said, a S.W.A.G. from programming skills not used in 20 years. :D |
|