[Bf-committers] Blender tangent space calculation

Morten Mikkelsen mikkelsen7 at gmail.com
Thu Nov 17 18:33:58 CET 2011


And flush_pixel() shows you how to traverse the buffer.
Essentially the way it works in blender is there's always 4 of them
per face whether it's a triangle or a quad.





On Thu, Nov 17, 2011 at 9:31 AM, Morten Mikkelsen <mikkelsen7 at gmail.com>wrote:

> Don't forget to look in do_multires_bake() in object_bake.c
> It shows you how to add the tangent layer:
>
> float *pvtangent= NULL;
>
> // create tangent vectors if not already created
> if(CustomData_get_layer_index(&dm->faceData, CD_TANGENT) == -1)
> 	DM_add_tangent_layer(dm);
>
> // get pointer to the already generated tangents
> pvtangent= DM_get_face_data_layer(dm, CD_TANGENT);
>
>
>
>
>
> On Thu, Nov 17, 2011 at 8:49 AM, Eugene Minov <minov.eug at gmail.com> wrote:
>
>> >
>> > >The proper way to get the tangent layer can be seen in:
>> > >
>> > >
>>
>> https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/object/object_bake.c
>> >
>>
>> Okay, I've found a 'multiresbake_get_normal' function for correct normals
>> calculation.
>> I also looked into 'DM_add_tangent_layer' function in:
>>
>> https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
>> According to it, the tangent layer is filling by tangents when created. So
>> I do
>> need only to access and welding them and normals?
>> That's good if so.
>>
>> Today I had time to try understand how RNA's works.
>> And I almost create and test python interface with collections for faces
>> and
>> indexed vertices with normals and tangents in it.
>> Hopefully soon I'll start welding.
>>
>> >
>> > >If you need a free ultra simple welder there's one here -->
>> > >http://jbit.net/~sparky/academic/welder/
>> > >You specify how many floats you have per vertex and it will weld for
>> you.
>> >
>>
>> Okay, good one, I think I'll use it :)
>>
>> Thanks!
>>
>> On Wed, Nov 16, 2011 at 8:43 PM, Morten Mikkelsen <mikkelsen7 at gmail.com
>> >wrote:
>>
>> > Sorry for confusing you here but I think I found a better reference for
>> you
>> > since
>> > you'll be needing the tangents too and you are not supposed to be
>> building
>> > them yourself.
>> >
>> > The proper way to get the tangent layer can be seen in:
>> >
>> >
>> >
>> https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/editors/object/object_bake.c
>> >
>> > do_multires_bake()
>> >
>> > These are being fetched after the line:
>> >
>> > float *pvtangent= NULL;
>> >
>> >
>> > These are then read in the function flush_pixel() including the normal
>> > which is fetched from there using multiresbake_get_normal()
>> > which as you can see looks a lot like the GetNormal() function
>> > I pointed you to in DerivedMesh.c.
>> > Anyway, definitely use this file as your reference. I should have shown
>> you
>> > this one from the beginning.
>> >
>> > If you need a free ultra simple welder there's one here -->
>> > http://jbit.net/~sparky/academic/welder/
>> > You specify how many floats you have per vertex and it will weld for
>> you.
>> >
>> >
>> >
>> > On Wed, Nov 16, 2011 at 5:32 AM, Eugene Minov <minov.eug at gmail.com>
>> wrote:
>> >
>> > > >
>> > > > >If you can get hold of the dm
>> > > > >(DerivedMesh)
>> > > > >on the c side of things then I can show you how to get the correct
>> > > normals
>> > > > >and tangents
>> > > > >and even help you get them welded should you want this.
>> > > >
>> > >
>> > > Ok! Sounds good to me :)
>> > >
>> > > So right now I in progress of checkout latest svn sources and compile
>> > > blender. (had problems with net)
>> > > Then first of I'll try to create test version of python/C interface.
>> I've
>> > > not decided yet what names I'll use for it.
>> > > And finally will be trying to implement it looking in DerivedMesh.c,
>> > > I think that it's realy are a good example.
>> > >
>> > > If or when I have a problem, I'll be glad to use your help :)
>> > > Many thanks for your kind cooperation!
>> > >
>> > >
>> > >
>> > > On Tue, Nov 15, 2011 at 10:41 PM, Morten Mikkelsen <
>> mikkelsen7 at gmail.com
>> > > >wrote:
>> > >
>> > > > I don't know anything about Python but if you can get hold of the dm
>> > > > (DerivedMesh)
>> > > > on the c side of things then I can show you how to get the correct
>> > > normals
>> > > > and tangents
>> > > > and even help you get them welded should you want this.
>> > > >
>> > > >
>> > > >
>> > > >
>> > > > On Tue, Nov 15, 2011 at 10:43 AM, Eugene Minov <minov.eug at gmail.com
>> >
>> > > > wrote:
>> > > >
>> > > > > Yes, I absolutely agree, hard faces obviously must be exported in
>> the
>> > > > same
>> > > > > way how they seen in render.
>> > > > > I think they can welds along with tangents.
>> > > > >
>> > > > > On Tue, Nov 15, 2011 at 9:01 PM, Morten Mikkelsen <
>> > > mikkelsen7 at gmail.com
>> > > > > >wrote:
>> > > > >
>> > > > > > There is no point in doing this unless you export the correct
>> > > tangents
>> > > > > and
>> > > > > > normals. That is the ones
>> > > > > > that were used to bake the normal map.
>> > > > > >
>> > > > > > I realize it blows that there is no API function to get the
>> render
>> > > > > normal.
>> > > > > > So what you have to do is produce it yourself
>> > > > > > like is done in
>> > > > > > DerivedMesh.c<
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>> https://svn.blender.org/svnroot/bf-blender/trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
>> > > > > > >
>> > > > > > and
>> > > > > > many other places as well.
>> > > > > > An example in this file is the static function GetNormal()
>> which is
>> > > > used
>> > > > > as
>> > > > > >  a call-back function by mikktspace.c
>> > > > > > and you can see how it uses the averaged normal if the face is
>> set
>> > to
>> > > > > > smooth and it uses
>> > > > > > the face normal which it calculates itself if the face is set to
>> > > flat.
>> > > > > >
>> > > > > > If you are going to make an api to export tangents I for one
>> cannot
>> > > > > > emphasize enough
>> > > > > > that I prefer an all or nothing solution. Either do it right or
>> > don't
>> > > > do
>> > > > > it
>> > > > > > at all.
>> > > > > > The last thing we need is to introduce a new tangent space
>> standard
>> > > > > within
>> > > > > > blender.
>> > > > > > Either export the correct basis that was used for baking (this
>> > > includes
>> > > > > the
>> > > > > > normal)
>> > > > > > or don't try to do it at all.
>> > > > > > _______________________________________________
>> > > > > > Bf-committers mailing list
>> > > > > > Bf-committers at blender.org
>> > > > > > http://lists.blender.org/mailman/listinfo/bf-committers
>> > > > > >
>> > > > > _______________________________________________
>> > > > > Bf-committers mailing list
>> > > > > Bf-committers at blender.org
>> > > > > http://lists.blender.org/mailman/listinfo/bf-committers
>> > > > >
>> > > > _______________________________________________
>> > > > Bf-committers mailing list
>> > > > Bf-committers at blender.org
>> > > > http://lists.blender.org/mailman/listinfo/bf-committers
>> > > >
>> > > _______________________________________________
>> > > Bf-committers mailing list
>> > > Bf-committers at blender.org
>> > > http://lists.blender.org/mailman/listinfo/bf-committers
>> > >
>> > _______________________________________________
>> > Bf-committers mailing list
>> > Bf-committers at blender.org
>> > http://lists.blender.org/mailman/listinfo/bf-committers
>> >
>> _______________________________________________
>> Bf-committers mailing list
>> Bf-committers at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-committers
>>
>
>


More information about the Bf-committers mailing list