|
From: Patrick H. <pa...@13...> - 2009-01-16 15:58:26
|
Sebastian Messerschmidt wrote:
> Patrick Hartling wrote:
>> Sebastian Messerschmidt wrote:
>>
>>> Hello,
>>>
>>> I'm currently using gmtl a lot for intersection testing. I've spotted
>>> some strange things in Intersection.h, where instead of DATA_TYPE float
>>> was used when returning intersection parameters (like tangent space for
>>> triangle/ray-intersection).
>>> When using double type Tri and Ray I had some numerical instabilities,
>>> which lead to artifacts in my routines. Changing the return values (e.g.
>>> u,v,t to DATA_TYPE& instead of float&) solved those problems.
>>>
>> This is a recurring problem in GMTL. It was generally tested with float, and
>> once in a while, you will come across a place where the code mistakenly uses
>> float explicitly instead of DATA_TYPE. I encourage you to fix any such
>> issues that you encounter. The nice thing is that when you fix it for
>> double, it should get fixed for all other data types.
>>
> O.K.. I've spotted those floats in several places and I will test those
> fixes as good as possible.
Thanks.
>>> The second question regards the triangle/linesegment intersection itself.
>>> It is stated, it will only work for CCW-oriented triangles, it however
>>> doesn't state, that intersection can only be done from one side.
>>> Assume a correctly assembled triangle: If intersection is done with a
>>> ray of direction (0,0,-1) it returns a correct result.
>>> Using a origin below the triangle and reversing the ray direction
>>> results in not hitting the triangle.
>>>
>>> There are two possible solutions to this:
>>> 1. Make the triangle intersection use a slightly other method (like
>>> moeller trumbore original does with precalculating the inverse
>>> determinant), which works excellent for me.
>>> 2. Make a second function using the latter method.
>>>
>> Someone more familiar with the specifics of this will have to comment. I
>> usually just make sure that things compile. :)
>>
>>
>>> Another thing I've come across is the mData members in most of the class
>>> used in gmtl.
>>> This make life a lot easier regarding serialization (I'm using
>>> non-intrusive serialization offered by boost), but it is not done
>>> consequently in all classes.
>>> For instance Tri<DATA_TYPE> doesn't declare its vertices public.
>>> So should this be done the same way for every class?
>>>
>> It could be, although I have often wondered about the reasoning behind
>> having the data members public. I realize the value of being able to pass a
>> pointer directly to glMultMatrix[fd](), but a const pointer can be retrieved
>> with an inline method call.
>>
>>
> The only reason I see so far is some optimization, but I'd rather lose
> some fancy data hiding if this allows us to do none-intrusive algorithms.
>> I will be interested to see how your serialization code will handle the
>> array serialization. I expect that you will be able to get the compiler to
>> figure out the array size in order to do the serialization generically.
>>
>>
> It's not my code really. It's just about using boost to do all the dirty
> work for you.
>
> For instance serializing the Vector class can be done like this:
>
> template <class Archive, typename DATA_TYPE, unsigned SIZE>
> void serialize( Archive & ar, gmtl::Vec<DATA_TYPE, SIZE> & v, const
> unsigned int )
> {
> ar & v.mData;
> }
>
> This will handle all Vectors. Simple aye?
Indeed. This is the sort of thing that I was hoping to see. :)
Boost.Serialization has a very nice API.
> I've done this a bit different, since using the upper method will add
> one additional size_t/unsigned int
> to the archive (to indicate the array length).
>
> template <class Archive, typename DATA_TYPE, unsigned SIZE>
> void serialize( Archive & ar, gmtl::Vec<DATA_TYPE, SIZE> & v, const
> unsigned int )
> {
> for(size_t i = 0; i < SIZE; ++i)
> {
> ar & v.mData[i];
> }
> }
>
> This might be a bit slower performance wise, but it saves me some data
> to be paged. (I'm having like billions of vectors to be saved)
> Sad thing is, that I am not sure about the loop unrolling in this function.
I expect that Kevin is right about the compiler doing the loop unrolling
given the involvement of compile-time constants. If you're really paranoid,
though, you could try to get Boost.MPL involved. Take a look at
gmtl/Misc/MatrixConvert.h to see a usage of Boost.MPL to do compile-time
loop unrolling (with Boost.Lambda thrown in because I saw an opportunity to
use it).
>>> I'd really like to submit the changes I've made so far, if you folks
>>> tell me how to provide you the sources.
>>>
>> Check out the CVS HEAD of the source tree and post unified diffs:
>>
>> cvs diff -u File.h > patch
>>
>> Then, post the patch as an attachment. Do not paste the text of the patch
>> into a message as critical formatting details can get munged by mail clients.
>>
> Can do :-)
> I will will split this into multiple patches.
That sounds great.
-Patrick
--
Patrick L. Hartling
Senior Software Engineer, Priority 5
http://www.priority5.com/
|