|
From: Patrick H. <pa...@in...> - 2007-06-13 02:13:46
|
Doug McCorkle wrote:
>=20
> On Jun 12, 2007, at 8:45 AM, Patrick Hartling wrote:
>=20
>> Patrick Hartling wrote:
>>> Doug McCorkle wrote:
>>>> On Jun 7, 2007, at 7:51 AM, Patrick Hartling wrote:
>>>>
>>>>> Doug McCorkle wrote:
>>>>>> Hello,
>>>>>>
>>>>>> When getting the matrix information from a PositionalInterfa=
ce
>>>>>> such as head position the matrix returned is a Matrix44f. Is it
>>>>>> possible to get a Matrix44d?
>>>>> Not from gadget::PositionProxy::getData(). The chain of data from
>>>>> the input
>>>>> device to your application object is all in single-precision
>>>>> floating-point
>>>>> data.
>>>>>
>>>> OK.
>>>>
>>>>>> Is there any easy way to convert from a
>>>>>> float matrix to a double matrix? Thanks for the help.
>>>>> Given the nature of C/C++, the simplest way that I know of to do it=
>>>>> would be
>>>>> the following:
>>>>>
>>>>> gmtl::Matrix44d double_mat;
>>>>> gmtl::Matrix44f float_mat =3D mDev->getData();
>>>>>
>>>>> for ( unsigned int i =3D 0; i < 16; ++i )
>>>>> {
>>>>> double_mat.mData[i] =3D float_mat.mData[i];
>>>>> }
>>>>>
>>>> This is what we are doing now.
>>>>
>>>>> You could easily make a function with a signature such as this to
>>>>> hide the
>>>>> details:
>>>>>
>>>>> gmtl::Matrix44d convert(const gmtl::Matrix44f& m);
>>>>>
>>>>> You could even take it a step further and make a generic GMTL-style=
>>>>> generator function. There might be some template-based approach
>>>>> that would
>>>>> allow for the loop to be unrolled, but I don't know what that would=
>>>>> be off
>>>>> the top of my head.
>>>>>
>>>> I was hoping for something like this. I will look into it. Thanks.
>>>
>>> I was thinking about this some more last night, and I just put
>>> together the
>>> attached code. The loop gets unrolled, and it will work for any
>>> pairing of
>>> gmtl::Matrix<S,R,C>/gmtl::Matrix<T,R,C> where S is convertible to T. =
If
>>> Boost.Lambda could be used, the code would be simpler because the
>>> separate
>>> set<...>() helper function and the usage of boost::bind() wouldn't be=
>>> needed, but in my experience, when data members are involved,
>>> boost::bind()
>>> always has to be used.
>>
>> I thought of a way to use Boost.Lambda. See the attachment.
>>
>>> Nevertheless, the loop unrolling and inlining should
>>> result in better performance than a regular for loop.
>>
>> I may have overstated this. I haven't done any performance tests on th=
is,
>> and boost::bind() carries with it a fair amount of overhead. There is
>> plenty
>> of inlining that can be taken advantage of, but the number of
>> instructions
>> executed is probably more than when using a loop. The question, then, =
is
>> whether the cost of those extra instructions is different than the
>> cost of
>> the branch instructions needed for looping.
>>
>=20
> Thanks! I will give this a try. After thinking about this more over the=
> past few days I wondered if it would be possible to generalize this to
> the datatype within gmtl? I thought that most underlying datatypes in
> gmtl are raw arrays so did not know if this could even be extended to
> quats and all the other gmtl datatypes.
That would require rather more sophisticated type traits than current exi=
st
in GMTL, and I think that the conversion functions would still have to be=
specialized on a per-type basis. For example, you wouldn't want to copy t=
he
internal array from a gmtl::Quatf to a gmtl::Vec4i just because they both=
have four values.
-Patrick
--=20
Patrick L. Hartling
VP Engineering, Infiscape Corp.
http://www.infiscape.com/
|