Hi John -- This is definitely a bug that needs to be fixed. and I'm sorry it
is impacting your work.

What I'm getting at is that it would really be nice if the FLT writer could
export the output of osgUtil::DelaunayTriangulator without having to put a
normal vector generator on top of it. 

FLT only supports normal per vertex, so there will need to be some type of
normal generation (at least duplication) in order for the exporter to
support BIND_PER_PRIMITIVE.
 
To me, BIND_PER_PRIMITIVE implies that the same normal is used at each
vertex of the component primitive (quad/triangle/line segment/whatever). So,
for example, given an array of 4 vertices to render 2 triangles, there would
be 2 normals, one for each triangle. The correct output in FLT would be 6
entries in the vertex palette, 3 with one normal and 3 with the other, and
the 2 shared vertices would have xyz values duplicated. (This is for Face
record usage; Mesh might be different.)
 
Currently, the structure of the FLT exporter is as simple as possible; when
it encounters a Geometry, it blindly adds the data to the vertex palette
without even looking at the primitive modes, and it currently depends on the
binding being PER_VERTEX (as you have discovered). This is clearly wrong and
needs to be fixed. To handle things correctly, either the data needs to be
preprocessed up front to fit this usage before being added to the
VertexPaletteManager, or the VertexPaletteManager itself needs to be smart
enough to handle it. In either case the process would be as follows:
 
We essentially need to change the Geometry data so that color and normal
bindings are per vertex (this is a FLT requirement). This would involve
iterating over all PrimitiveSets and doing a switch/case on the primitive
mode, then copying existing data into new arrays.
 
Also, we need to special case BIND_OVERALL color, because FLT files have the
concept of a single color specified in the Face record. So we don't want to
expand that out to BIND_PER_VERTEX.
 
Then we also need to be sure to handle the "sharing" feature correctly. The
current code is optimized to support two Geometry objects sharing the same
vertex arrays; if the address of the arrays match, the code assumes the data
is already in the vertex palette and simply indexes into the existing data.
However, if we have to preprocess the data and generate new arrays on the
fly to support BIND_PER_PRIMITIVE, then we must instruct the
VertexPaletteManager to disable sharing for those arrays. I believe there is
already a flag for this, as I had to do something similar for light points.
 
All this is doable but tedious. I won't get to it in the next few weeks; I
might not get to it until early next year (yes, I'm booked pretty solid
these days).
   -Paul
 
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to