📄 ply.c
字号:
*num_comments = plyfile->num_comments;
return (plyfile->comments);
}
/******************************************************************************
Extract the object information (arbitrary text) from the header information
of a PLY file.
Entry:
plyfile - file identifier
Exit:
num_obj_info - number of lines of text information returned
returns a pointer to a list of object info lines
******************************************************************************/
char **get_obj_info_ply(PlyFile *plyfile, int *num_obj_info)
{
*num_obj_info = plyfile->num_obj_info;
return (plyfile->obj_info);
}
/******************************************************************************
Make ready for "other" properties of an element-- those properties that
the user has not explicitly asked for, but that are to be stashed away
in a special structure to be carried along with the element's other
information.
Entry:
plyfile - file identifier
elem - element for which we want to save away other properties
******************************************************************************/
void setup_other_props(PlyFile *plyfile, PlyElement *elem)
{
int i;
PlyProperty *prop;
int size = 0;
int type_size;
/* Examine each property in decreasing order of size. */
/* We do this so that all data types will be aligned by */
/* word, half-word, or whatever within the structure. */
for (type_size = 8; type_size > 0; type_size /= 2) {
/* add up the space taken by each property, and save this information */
/* away in the property descriptor */
for (i = 0; i < elem->nprops; i++) {
/* don't bother with properties we've been asked to store explicitly */
if (elem->store_prop[i])
continue;
prop = elem->props[i];
/* internal types will be same as external */
prop->internal_type = prop->external_type;
prop->count_internal = prop->count_external;
/* list case */
if (prop->is_list == PLY_LIST) {
/* pointer to list */
if (type_size == sizeof (void *)) {
prop->offset = size;
size += sizeof (void *); /* always use size of a pointer here */
}
/* count of number of list elements */
if (type_size == ply_type_size[prop->count_external]) {
prop->count_offset = size;
size += ply_type_size[prop->count_external];
}
}
/* string */
else if (prop->is_list == PLY_STRING) {
/* pointer to string */
if (type_size == sizeof (char *)) {
prop->offset = size;
size += sizeof (char *);
}
}
/* scalar */
else if (type_size == ply_type_size[prop->external_type]) {
prop->offset = size;
size += ply_type_size[prop->external_type];
}
}
}
/* save the size for the other_props structure */
elem->other_size = size;
}
/******************************************************************************
Specify that we want the "other" properties of an element to be tucked
away within the user's structure.
Entry:
plyfile - file identifier
elem - the element that we want to store other_props in
offset - offset to where other_props will be stored inside user's structure
Exit:
returns pointer to structure containing description of other_props
******************************************************************************/
static PlyOtherProp *get_other_properties(
PlyFile *plyfile,
PlyElement *elem,
int offset
)
{
int i;
PlyOtherProp *other;
PlyProperty *prop;
int nprops;
/* remember that this is the "current" element */
plyfile->which_elem = elem;
/* save the offset to where to store the other_props */
elem->other_offset = offset;
/* place the appropriate pointers, etc. in the element's property list */
setup_other_props (plyfile, elem);
/* create structure for describing other_props */
other = (PlyOtherProp *) myalloc (sizeof (PlyOtherProp));
other->name = strdup (elem->name);
#if 0
if (elem->other_offset == NO_OTHER_PROPS) {
other->size = 0;
other->props = NULL;
other->nprops = 0;
return (other);
}
#endif
other->size = elem->other_size;
other->props = (PlyProperty **) myalloc (sizeof(PlyProperty) * elem->nprops);
/* save descriptions of each "other" property */
nprops = 0;
for (i = 0; i < elem->nprops; i++) {
if (elem->store_prop[i])
continue;
prop = (PlyProperty *) myalloc (sizeof (PlyProperty));
copy_property (prop, elem->props[i]);
other->props[nprops] = prop;
nprops++;
}
other->nprops = nprops;
/* set other_offset pointer appropriately if there are NO other properties */
if (other->nprops == 0) {
elem->other_offset = NO_OTHER_PROPS;
}
/* return structure */
return (other);
}
/******************************************************************************
Specify that we want the "other" properties of an element to be tucked
away within the user's structure. The user needn't be concerned for how
these properties are stored.
Entry:
plyfile - file identifier
elem_name - name of element that we want to store other_props in
offset - offset to where other_props will be stored inside user's structure
Exit:
returns pointer to structure containing description of other_props
******************************************************************************/
PlyOtherProp *ply_get_other_properties(
PlyFile *plyfile,
char *elem_name,
int offset
)
{
PlyElement *elem;
PlyOtherProp *other;
/* find information about the element */
elem = find_element (plyfile, elem_name);
if (elem == NULL) {
fprintf (stderr, "ply_get_other_properties: Can't find element '%s'\n",
elem_name);
return (NULL);
}
other = get_other_properties (plyfile, elem, offset);
return (other);
}
/*************************/
/* Other Element Stuff */
/*************************/
/******************************************************************************
Grab all the data for the current element that a user does not want to
explicitly read in. Stores this in the PLY object's data structure.
Entry:
plyfile - pointer to file
Exit:
returns pointer to ALL the "other" element data for this PLY file
******************************************************************************/
PlyOtherElems *get_other_element_ply (PlyFile *plyfile)
{
int i;
PlyElement *elem;
char *elem_name;
int elem_count;
PlyOtherElems *other_elems;
OtherElem *other;
elem = plyfile->which_elem;
elem_name = elem->name;
elem_count = elem->num;
/* create room for the new "other" element, initializing the */
/* other data structure if necessary */
if (plyfile->other_elems == NULL) {
plyfile->other_elems = (PlyOtherElems *) myalloc (sizeof (PlyOtherElems));
other_elems = plyfile->other_elems;
other_elems->other_list = (OtherElem *) myalloc (sizeof (OtherElem));
other = &(other_elems->other_list[0]);
other_elems->num_elems = 1;
}
else {
other_elems = plyfile->other_elems;
other_elems->other_list = (OtherElem *) realloc (other_elems->other_list,
sizeof (OtherElem) * other_elems->num_elems + 1);
other = &(other_elems->other_list[other_elems->num_elems]);
other_elems->num_elems++;
}
/* count of element instances in file */
other->elem_count = elem_count;
/* save name of element */
other->elem_name = strdup (elem_name);
/* create a list to hold all the current elements */
other->other_data = (OtherData **)
malloc (sizeof (OtherData *) * other->elem_count);
/* set up for getting elements */
other->other_props = ply_get_other_properties (plyfile, elem_name,
offsetof(OtherData,other_props));
/* grab all these elements */
for (i = 0; i < other->elem_count; i++) {
/* grab and element from the file */
other->other_data[i] = (OtherData *) malloc (sizeof (OtherData));
ply_get_element (plyfile, (void *) other->other_data[i]);
}
/* return pointer to the other elements data */
return (other_elems);
}
/******************************************************************************
Write out the "other" elements specified for this PLY file.
Entry:
plyfile - pointer to PLY file to write out other elements for
******************************************************************************/
void put_other_elements_ply (PlyFile *plyfile)
{
int i,j;
OtherElem *other;
/* make sure we have other elements to write */
if (plyfile->other_elems == NULL)
return;
/* write out the data for each "other" element */
for (i = 0; i < plyfile->other_elems->num_elems; i++) {
other = &(plyfile->other_elems->other_list[i]);
put_element_setup_ply (plyfile, other->elem_name);
/* write out each instance of the current element */
for (j = 0; j < other->elem_count; j++)
put_element_ply (plyfile, (void *) other->other_data[j]);
}
}
/******************************************************************************
Free up storage used by an "other" elements data structure.
Entry:
other_elems - data structure to free up
******************************************************************************/
void free_other_elements_ply (PlyOtherElems *other_elems)
{
}
/*******************/
/* Miscellaneous */
/*******************/
/******************************************************************************
Close a PLY file.
Entry:
plyfile - identifier of file to close
******************************************************************************/
void ply_close(PlyFile *plyfile)
{
fclose (plyfile->fp);
/* free up memory associated with the PLY file */
free (plyfile);
}
/******************************************************************************
Get version number and file type of a PlyFile.
Entry:
ply - pointer to PLY file
Exit:
version - version of the file
file_type - PLY_ASCII, PLY_BINARY_BE, or PLY_BINARY_LE
******************************************************************************/
void get_info_ply(PlyFile *ply, float *version, int *file_type)
{
if (ply == NULL)
return;
*version = ply->version;
*file_type = ply->file_type;
}
/******************************************************************************
Compare two strings. Returns 1 if they are the same, 0 if not.
******************************************************************************/
int equal_strings(char *s1, char *s2)
{
while (*s1 && *s2)
if (*s1++ != *s2++)
return (0);
if (*s1 != *s2)
return (0);
else
return (1);
}
/******************************************************************************
Re-create the command line that was used to invoke this program.
Entry:
argc - number of words in argv
argv - array of words in command line
******************************************************************************/
char *recreate_command_line (int argc, char *argv[])
{
int i;
char *line;
int len = 0;
/* count total number of characters needed, including separating spaces */
for (i = 0; i < argc; i++)
len += strlen(argv[i]) + 1;
/* create empty line */
line = (char *) malloc (sizeof(char) * len);
line[0] = '\0';
/* repeatedly append argv */
for (i = 0; i < argc; i++) {
strcat (line, argv[i]);
if (i != argc - 1)
strcat (line, " ");
}
return (line);
}
/******************************************************************************
Find an element from the element list of a given PLY object.
Entry:
plyfile - file id for PLY file
element - name of element we're looking for
Exit:
returns the element, or NULL if not found
******************************************************************************/
PlyElement *find_element(PlyFile *plyfile, char *element)
{
int i;
for (i = 0; i < plyfile->num_elem_types; i++)
if (equal_strings (element, plyfile->elems[i]->name))
return (plyfile->elems[i]);
return (NULL);
}
/******************************************************************************
Find a property in the list of properties of a given element.
Entry:
elem - pointer to element in which we want to find the property
prop_name - name of property to find
Exit:
index - index to position in list
returns a pointer to the property, or NULL if not found
******************************************************************************/
PlyProperty *find_property(PlyElement *elem, char *prop_name, int *index)
{
int i;
for (i = 0; i < elem->nprops; i++)
if (equal_strings (prop_name, elem->props[i]->name)) {
*index = i;
return (elem->props[i]);
}
*index = -1;
return (NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -