QModelIndex cast( NifModel * nif, const QModelIndex & index ) { QModelIndex iData = getShapeData( nif, index ); QVector<Vector3> verts = nif->getArray<Vector3>( iData, "Vertices" ); QVector<Triangle> triangles; QModelIndex iPoints = nif->getIndex( iData, "Points" ); if ( iPoints.isValid() ) { QList< QVector< quint16 > > strips; for ( int r = 0; r < nif->rowCount( iPoints ); r++ ) strips.append( nif->getArray<quint16>( iPoints.child( r, 0 ) ) ); triangles = triangulate( strips ); } else { triangles = nif->getArray<Triangle>( iData, "Triangles" ); } QVector<Vector3> norms( verts.count() ); foreach ( Triangle tri, triangles ) { Vector3 a = verts[ tri[0] ]; Vector3 b = verts[ tri[1] ]; Vector3 c = verts[ tri[2] ]; Vector3 fn = Vector3::crossproduct( b - a, c - a ); norms[ tri[0] ] += fn; norms[ tri[1] ] += fn; norms[ tri[2] ] += fn; }
void btParticlesDynamicsWorld::initDeviceData() { getShapeData(); }
bool isApplicable( const NifModel * nif, const QModelIndex & index ) { return getShapeData( nif, index ).isValid(); }