/*
The interface routines for reading and writing PLY polygon files.
Greg Turk
---------------------------------------------------------------
A PLY file contains a single polygonal _object_.
An object is composed of lists of _elements_. Typical elements are
vertices, faces, edges and materials.
Each type of element for a given object has one or more _properties_
associated with the element type. For instance, a vertex element may
have as properties the floating-point values x,y,z and the three unsigned
chars representing red, green and blue.
-----------------------------------------------------------------------
Copyright (c) 1998 Georgia Institute of Technology. All rights reserved.
Permission to use, copy, modify and distribute this software and its
documentation for any purpose is hereby granted without fee, provided
that the above copyright notice and this permission notice appear in
all copies of this software and that you do not sell the software.
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ply.h>
char *type_names[] = { /* names of scalar types */
"invalid",
"int8", "int16", "int32", "uint8", "uint16", "uint32", "float32", "float64",
};
char *old_type_names[] = { /* old names of types for backward compatability */
"invalid",
"char", "short", "int", "uchar", "ushort", "uint", "float", "double",
};
int ply_type_size[] = {
0, 1, 2, 4, 1, 2, 4, 4, 8
};
#define NO_OTHER_PROPS -1
#define DONT_STORE_PROP 0
#define STORE_PROP 1
#define OTHER_PROP 0
#define NAMED_PROP 1
/* returns 1 if strings are equal, 0 if not */
int equal_strings(char *, char *);
/* find an element in a plyfile's list */
PlyElement *find_element(PlyFile *, char *);
/* find a property in an element's list */
PlyProperty *find_property(PlyElement *, char *, int *);
/* write to a file the word describing a PLY file data type */
void write_scalar_type (FILE *, int);
/* read a line from a file and break it up into separate words */
char **get_words(FILE *, int *, char **);
/* write an item to a file */
void write_binary_item(FILE *, int, unsigned int, double, int);
void write_ascii_item(FILE *, int, unsigned int, double, int);
/* add information to a PLY file descriptor */
void add_element(PlyFile *, char **, int);
void add_property(PlyFile *, char **, int);
void add_comment(PlyFile *, char *);
void add_obj_info(PlyFile *, char *);
/* copy a property */
void copy_property(PlyProperty *, PlyProperty *);
/* store a value into where a pointer and a type specify */
void store_item(char *, int, int, unsigned int, double);
/* return the value of a stored item */
void get_stored_item( void *, int, int *, unsigned int *, double *);
/* return the value stored in an item, given ptr to it and its type */
double get_item_value(char *, int);
/* get binary or ascii item and store it according to ptr and type */
void get_ascii_item(char *, int, int *, unsigned int *, double *);
void get_binary_item(FILE *, int, int *, unsigned int *, double *);
/* get a bunch of elements from a file */
void ascii_get_element(PlyFile *, char *);
void binary_get_element(PlyFile *, char *);
/* memory allocation */
static char *my_alloc(int, int, char *);
/*************/
/* Writing */
/*************/
/******************************************************************************
Given a file pointer, get ready to write PLY data to the file.
Entry:
fp - the given file pointer
nelems - number of elements in object
elem_names - list of element names
file_type - file type, either ascii or binary
Exit:
returns a pointer to a PlyFile, used to refer to this file, or NULL if error
******************************************************************************/
PlyFile *ply_write(
FILE *fp,
int nelems,
char **elem_names,
int file_type
)
{
int i;
PlyFile *plyfile;
PlyElement *elem;
/* check for NULL file pointer */
if (fp == NULL)
return (NULL);
/* create a record for this object */
plyfile = (PlyFile *) myalloc (sizeof (PlyFile));
plyfile->file_type = file_type;
plyfile->num_comments = 0;
plyfile->num_obj_info = 0;
plyfile->num_elem_types = nelems;
plyfile->version = 1.0;
plyfile->fp = fp;
plyfile->other_elems = NULL;
/* tuck aside the names of the elements */
plyfile->elems = (PlyElement **) myalloc (sizeof (PlyElement *) * nelems);
for (i = 0; i < nelems; i++) {
elem = (PlyElement *) myalloc (sizeof (PlyElement));
plyfile->elems[i] = elem;
elem->name = strdup (elem_names[i]);
elem->num = 0;
elem->nprops = 0;
}
/* return pointer to the file descriptor */
return (plyfile);
}
/******************************************************************************
Open a polygon file for writing.
Entry:
filename - name of file to read from
nelems - number of elements in object
elem_names - list of element names
file_type - file type, either ascii or binary
Exit:
returns a file identifier, used to refer to this file, or NULL if error
******************************************************************************/
PlyFile *open_for_writing_ply(
char *filename,
int nelems,
char **elem_names,
int file_type
)
{
int i;
PlyFile *plyfile;
PlyElement *elem;
char *name;
FILE *fp;
/* tack on the extension .ply, if necessary */
name = (char *) myalloc (sizeof (char) * (strlen (filename) + 5));
strcpy (name, filename);
if (strlen (name) < 4 ||
strcmp (name + strlen (name) - 4, ".ply") != 0)
strcat (name, ".ply");
/* open the file for writing */
fp = fopen (name, "w");
if (fp == NULL) {
return (NULL);
}
/* create the actual PlyFile structure */
plyfile = ply_write (fp, nelems, elem_names, file_type);
if (plyfile == NULL)
return (NULL);
/* return pointer to the file descriptor */
return (plyfile);
}
/******************************************************************************
Describe an element, including its properties and how many will be written
to the file.
Entry:
plyfile - file identifier
elem_name - name of element that information is being specified about
nelems - number of elements of this type to be written
nprops - number of properties contained in the element
prop_list - list of properties
******************************************************************************/
void element_layout_ply(
PlyFile *plyfile,
char *elem_name,
int nelems,
int nprops,
PlyProperty *prop_list
)
{
int i;
PlyElement *elem;
PlyProperty *prop;
/* look for appropriate element */
elem = find_element (plyfile, elem_name);
if (elem == NULL) {
fprintf(stderr,"element_layout_ply: can't find element '%s'\n",elem_name);
exit (-1);
}
elem->num = nelems;
/* copy the list of properties */
elem->nprops = nprops;
elem->props = (PlyProperty **) myalloc (sizeof (PlyProperty *) * nprops);
elem->store_prop = (char *) myalloc (sizeof (char) * nprops);
for (i = 0; i < nprops; i++) {
prop = (PlyProperty *) myalloc (sizeof (PlyProperty));
elem->props[i] = prop;
elem->store_prop[i] = NAMED_PROP;
copy_property (prop, &prop_list[i]);
}
}
/******************************************************************************
Describe a property of an element.
Entry:
plyfile - file identifier
elem_name - name of element that information is being specified about
prop - the new property
******************************************************************************/
void ply_describe_property(
PlyFile *plyfile,
char *elem_name,
PlyProperty *prop
)
{
PlyElement *elem;
PlyProperty *elem_prop;
/* look for appropriate element */
elem = find_element (plyfile, elem_na
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
pbrt-src-1.02.zip_pbrt_基于物理渲染 (1172个子文件)
ply.c 87KB
3ds2lrt.c 14KB
ply2pbrt.c 7KB
doxygen.conf 39KB
sampledata.cpp 328KB
exphotonmap.cpp 24KB
color.cpp 21KB
photonmap.cpp 17KB
api.cpp 17KB
reflection.cpp 16KB
kdtree.cpp 15KB
dynload.cpp 15KB
util.cpp 13KB
loopsubdiv.cpp 13KB
grid.cpp 13KB
paramset.cpp 12KB
irradiancecache.cpp 12KB
trianglemesh.cpp 12KB
igi.cpp 10KB
nurbs.cpp 10KB
texture.cpp 9KB
checkerboard.cpp 8KB
sphere.cpp 8KB
samplepat.cpp 8KB
samplepat.cpp 7KB
hyperboloid.cpp 7KB
bidirectional.cpp 7KB
image.cpp 7KB
infinitesample.cpp 7KB
directlighting.cpp 7KB
imagemap.cpp 6KB
transform.cpp 6KB
transport.cpp 6KB
paraboloid.cpp 6KB
exrtotiff.cpp 6KB
cylinder.cpp 6KB
cone.cpp 5KB
infinite.cpp 5KB
bestcandidate.cpp 5KB
tifftoexr.cpp 5KB
whitted.cpp 4KB
projection.cpp 4KB
mc.cpp 4KB
stratified.cpp 4KB
film.cpp 4KB
volume.cpp 4KB
path.cpp 4KB
disk.cpp 4KB
primitive.cpp 4KB
lowdiscrepancy.cpp 4KB
exrassemble.cpp 4KB
debug.cpp 4KB
dots.cpp 4KB
scene.cpp 4KB
spot.cpp 4KB
single.cpp 4KB
volumegrid.cpp 3KB
bilerp.cpp 3KB
random.cpp 3KB
perspective.cpp 3KB
goniometric.cpp 3KB
exrio.cpp 3KB
highcontrast.cpp 3KB
orthographic.cpp 3KB
translucent.cpp 3KB
distant.cpp 3KB
area.cpp 3KB
uber.cpp 3KB
shape.cpp 3KB
sampling.cpp 3KB
heightfield.cpp 3KB
emission.cpp 3KB
timer.cpp 3KB
environment.cpp 3KB
marble.cpp 2KB
homogeneous.cpp 2KB
point.cpp 2KB
clay.cpp 2KB
bluepaint.cpp 2KB
brushedmetal.cpp 2KB
shinymetal.cpp 2KB
primer.cpp 2KB
felt.cpp 2KB
skin.cpp 2KB
plastic.cpp 2KB
exravg.cpp 2KB
substrate.cpp 2KB
uv.cpp 2KB
glass.cpp 2KB
exponential.cpp 2KB
camera.cpp 2KB
material.cpp 2KB
matte.cpp 2KB
geometry.cpp 2KB
wrinkled.cpp 2KB
fbm.cpp 2KB
mirror.cpp 1KB
windy.cpp 1KB
mix.cpp 1KB
mitchell.cpp 1KB
共 1172 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
邓凌佳
- 粉丝: 65
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功