|
From: Doug M. <mc...@ia...> - 2007-06-13 03:57:21
|
On Jun 12, 2007, at 10:02 PM, Patrick Hartling wrote:
> Doug McCorkle wrote:
>>
>> On Jun 12, 2007, at 9:13 PM, Patrick Hartling wrote:
>>
>>> Doug McCorkle wrote:
>>>>
>>>> On Jun 12, 2007, at 8:45 AM, Patrick Hartling wrote:
>>>>
>>>>> 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
>>>>>>>>> PositionalInterface
>>>>>>>>> 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 = mDev->getData();
>>>>>>>>
>>>>>>>> for ( unsigned int i = 0; i < 16; ++i )
>>>>>>>> {
>>>>>>>> double_mat.mData[i] = 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
>>>>> this,
>>>>> 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.
>>>>>
>>>>
>>>> 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
>>> exist
>>> 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 the
>>> internal array from a gmtl::Quatf to a gmtl::Vec4i just because
>>> they both
>>> have four values.
>>
>> Right. I was more thinking same type to same type restrictions.
>
> I am not sure if this could be generalized fully. I tried some
> stuff with a
> template template parameter so that the input and output types
> could be
> matched without being identified explicitly, but I haven't been
> able to get
> anything to compile yet. The basic idea I have is shown in the
> attached
> file. My current suspicion is that the variation in number of template
> parameters among GMTL types (gmtl::Matrix<T,R,C>, gmtl::Vec<T,S>,
> gmtl::Quat<T>, etc.) will make things tough. Beyond that, the mData
> member
> is not always an array, so specialization would be needed anyway.
> There may
> yet be a way to do it, but I am reaching the (current) limits of my
> understanding of C++ templates. Overloading the function that I
> sent out
> earlier is the simplest approach.
>
What you sent out earlier is very helpful. I am not trying to imply
that I need anything more, it was more just a thought of something
interesting to add to GMTL. Thanks for the effort in figuring
something out.
Doug
|