```global proc getNormals(string \$tnode, vector \$data[]) {
int     \$count = size(\$data);

// Step 1: Decide what is selected.
string \$vertices[] = `filterExpand -sm 31`;

// Individual vertices have NOT been selected so we
if(size(\$vertices) == 0) {
string  \$shapes[] = `listRelatives -shapes \$tnode`;

if(size(\$shapes) == 1) {
int     \$num_vertices[] = `polyEvaluate -v \$tnode`;
string  \$shape = \$shapes[0];
float   \$norms[];
vector  \$ave;

for(\$n = 0; \$n < \$num_vertices[0]; \$n++) {
\$vertex_text = \$shape + ".vtx[" + \$n + "]";
\$norms = `polyNormalPerVertex -q -xyz \$vertex_text`;
\$ave = getAverageNormal(\$norms);
\$data[\$count] = << \$ave.x, \$ave.y, \$ave.z >>;
\$count++;
}
}
else  // tnode is a group node
{
string  \$children[] = `listRelatives -children \$tnode`;
for(\$child in \$children) {
getNormals(\$child, \$data);
}
}
}
else    // here we get selected vertex normals
{
float   \$norms[];
vector  \$ave;
for(\$vert in \$vertices) {
\$norms = `polyNormalPerVertex -q -xyz \$vertices`;
\$ave = getAverageNormal(\$norms);
\$data[\$count] = << \$ave.x, \$ave.y, \$ave.z >>;
\$count++;
}
}
}

// Used by getNormals()
global proc vector getAverageNormal(float \$norms[]) {
float   \$x = 0, \$y = 0, \$z = 0;
int     \$numComps = size(\$norms);
int     \$numNorms = \$numComps/3;

if(\$numNorms == 1)
return <<\$norms[0],\$norms[1],\$norms[2]>>;
for(\$n = 0; \$n < \$numComps - 3; \$n += 3) {
\$x += \$norms[\$n];
\$y += \$norms[\$n + 1];
\$z += \$norms[\$n + 2];
}
return <<\$x/\$numNorms, \$y/\$numNorms, \$z/\$numNorms >>;
}
```