[Bf-committers] Blender tangent space calculation

Eugene Minov minov.eug at gmail.com
Fri Nov 18 20:04:48 CET 2011


Sorry for extra line :)

I wanted to ask about this line:
const int iGetNrVerts= data->mface[face_num].v4!=0 ? 4 : 3;

I think 'iGetNrVerts' may be incorrect with some cases when there is four
vertices per face but the last one is points to first indexed vertex.
Or there is no way that last index points to zero?

On Fri, Nov 18, 2011 at 9:48 PM, Eugene Minov <minov.eug at gmail.com> wrote:

> Hi!
>
> I think that I've finished this.
>
> >
> > >Don't forget to look in do_multires_bake() in object_bake.c
> > >It shows you how to add the tangent layer:
> >
>
> Yes, I've figured out how to create DerivedMesh object by Mesh object.
> And then I've created the tangent layer in this way.
>
> >
> > >// get pointer to the already generated tangents
> > >pvtangent= DM_get_face_data_layer(dm, CD_TANGENT);
> >
>
> But if mesh don't have a tex-coords, 'pvtangent' anyway is NULL
> For this case I weld normals only.
>
> I tried to export a mesh with tangents and normals into my app
> and seems that normal map looking correct.
>
> const int iGetNrVerts= data->mface[face_num].v4!=0 ? 4 : 3;
>
> On Thu, Nov 17, 2011 at 8:33 PM, Morten Mikkelsen <mikkelsen7 at gmail.com>wrote:
>
>> 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
>> >>
>> >
>> >
>> _______________________________________________
>> 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