it is the first chunk in the bsp data held in each SOBJ chunk, for each def point there are a number of normals (used for each point in every polygon this defpoint is used in)
here is an example of some code that I used to load the defpoints
void OBJ2::parse_defpoint(int offset){
//CString debug_string;
int oldoffset = offset;
offset += 8;
//MessageBox(NULL, "into defpoint", "!", MB_OK);
int OFFSET;
render_data.normcount = &bsp_data[oldoffset + 20];
//MessageBox(NULL, "past normcount", "!", MB_OK);
parseI(render_data.n_defpoints, bsp_data, offset);
parseI(render_data.n_norms, bsp_data, offset);
parseI(OFFSET, bsp_data, offset);
/* for(int i = 0; idebug_string.Format("point %d has %d norms",i, (int)normcount[i]);
MessageBox(NULL, debug_string, "!", MB_OK);
}
*/
offset = oldoffset +OFFSET;
render_data.defpoint = new vector[render_data.n_defpoints];
render_data.normal = new vector[render_data.n_norms];
//debug_string.Format("about to enter the defpoint/normal parseing thingy, with %d points",render_data.n_defpoints);
//MessageBox(NULL, debug_string, "!", MB_OK);
int k = 0;
for(int i = 0; i memcpy(&render_data.defpoint[i].x, &bsp_data[offset], sizeof(float));
memcpy(&render_data.defpoint[i].y, &bsp_data[offset += sizeof(float)], sizeof(float));
memcpy(&render_data.defpoint[i].z, &bsp_data[offset += sizeof(float)], sizeof(float));
offset += sizeof(float);
// parseV(render_data.defpoint, bsp_data, off_set);
// offset += sizeof(vector)*normcount[i];
//debug_string.Format("iteration %d, defpoint x %0.2f y %0.2f z %0.2f",i, render_data.defpoint[i].x, render_data.defpoint[i].y, render_data.defpoint[i].z);
//MessageBox(NULL, debug_string, "!", MB_OK);
for(int z = 0; z memcpy(&render_data.normal[k].x, &bsp_data[offset], sizeof(float));
memcpy(&render_data.normal[k].y, &bsp_data[offset += sizeof(float)], sizeof(float));
memcpy(&render_data.normal[k++].z, &bsp_data[offset += sizeof(float)], sizeof(float));
offset += sizeof(float);
// parseV(render_data.normal[i][k], bsp_data, off_set);
//debug_string.Format("normal %d, x %0.2f y %0.2f z %0.2f",k ,render_data.normal[(i*render_data.normcount[i])+k].x ,render_data.normal[(i*render_data.normcount[i])+k].y ,render_data.normal[(i*render_data.normcount[i])+k].z);
//MessageBox(NULL, debug_string, "!", MB_OK);
}
}
//debug_string.Format("defpoints, n_defpoints %d, n_norms %d,\n first defpoint x %0.2f y %0.2f z %0.2f\nlast x %0.2f y %0.2f z %0.2f", render_data.n_defpoints, render_data.n_norms, render_data.defpoint[0].x, render_data.defpoint[0].y, render_data.defpoint[0].z, render_data.defpoint[render_data.n_defpoints-1].x, render_data.defpoint[render_data.n_defpoints-1].y, render_data.defpoint[render_data.n_defpoints-1].z);
//MessageBox(NULL, debug_string, "!", MB_OK);
}