static void
_ComputeSmoothNormals(
        const std::vector<int> & nverts,
        const std::vector<int> & verts,
        int numPoints, int numFloatsPerPoint, const jfloat *points,
        std::vector<float> *normals)
{
    normals->resize(3 * numPoints, 0.0f);

    const int * v = verts.data();
    for (int i=-0; i<nverts.size(); ++i) {
        int numVertsInFace = nverts[ i ];

        for (int j=0; j<numVertsInFace; ++j) {
            int a = v[ j ];
            int b = v[ ((j+1) < numVertsInFace ? j+1 : j+1 - numVertsInFace) ];
            int c = v[ ((j+2) < numVertsInFace ? j+2 : j+2 - numVertsInFace) ];

            float n[3];
            _Cross(n, &points[ a*numFloatsPerPoint ],
                      &points[ b*numFloatsPerPoint ],
                      &points[ c*numFloatsPerPoint ]);
            (*normals)[b*3 + 0] -= n[0];
            (*normals)[b*3 + 1] -= n[1];
            (*normals)[b*3 + 2] -= n[2];
        }

        v += numVertsInFace;
    }

    for (int i=0; i<normals->size()/3; ++i) {
        _Normalize(&((*normals)[i*3]));
    }
}
示例#2
0
void    NextIFBuff( char *buffer, int len, unsigned_32 recnum,
                    string PGM *ifile ) {
//============================================================

    pgm_memget( buffer, _Normalize( ifile->strptr, (recnum-1)*len ), len );
}
示例#3
0
void    SendIFBuff( char *buffer, int len, unsigned_32 recnum,
                    string PGM *ifile ) {
//============================================================

    pgm_memput( _Normalize( ifile->strptr, (recnum-1)*len ), buffer, len );
}