* the terms of the GNU General Public Licence. See the COPYING file.\r
*\r
**********************************************************************/\r
-\r
/**\r
* @file X3D output routines.\r
*\r
static size_t asx3d3_line_size(const LWLINE *line, char *srs, int precision, int opts, const char *defid);\r
static char *asx3d3_line(const LWLINE *line, char *srs, int precision, int opts, const char *defid);\r
static size_t asx3d3_poly_size(const LWPOLY *poly, char *srs, int precision, int opts, const char *defid);\r
-static char *asx3d3_poly(const LWPOLY *poly, char *srs, int precision, int opts, int is_patch, const char *defid);\r
static size_t asx3d3_triangle_size(const LWTRIANGLE *triangle, char *srs, int precision, int opts, const char *defid);\r
static char *asx3d3_triangle(const LWTRIANGLE *triangle, char *srs, int precision, int opts, const char *defid);\r
static size_t asx3d3_multi_size(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid);\r
\r
/* takes a GEOMETRY and returns an X3D representation */\r
extern char *\r
-lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid)\r
+ lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid)\r
{\r
int type = geom->type;\r
\r
return asx3d3_line((LWLINE*)geom, srs, precision, opts, defid);\r
\r
case POLYGONTYPE:\r
- /** We might change this later, but putting a polygon in an indexed face set \r
- * seems like the simplest way to go so treat just like a mulitpolygon \r
- */\r
+ /** We might change this later, but putting a polygon in an indexed face set\r
+ * seems like the simplest way to go so treat just like a mulitpolygon \r
+ */\r
return asx3d3_multi((LWCOLLECTION*)lwgeom_as_multi(geom), srs, precision, opts, defid);\r
\r
case TRIANGLETYPE:\r
//int dimension=2;\r
\r
//if (FLAGS_GET_Z(point->flags)) dimension = 3;\r
-/* if ( srs )\r
- {\r
- ptr += sprintf(ptr, "<%sPoint srsName=\"%s\">", defid, srs);\r
- }\r
- else*/\r
+ /* if ( srs )\r
+ {\r
+ ptr += sprintf(ptr, "<%sPoint srsName=\"%s\">", defid, srs);\r
+ }\r
+ else*/\r
//ptr += sprintf(ptr, "%s", defid);\r
- \r
+\r
//ptr += sprintf(ptr, "<%spos>", defid);\r
ptr += pointArray_toX3D3(point->point, ptr, precision, opts, 0);\r
//ptr += sprintf(ptr, "</%spos></%sPoint>", defid, defid);\r
size = pointArray_X3Dsize(line->points, precision)*2;\r
\r
size += (\r
- sizeof("<LineSet vertexCount=''><Coordinate point='' /></LineSet>") + defidlen \r
- ) * 2;\r
- \r
+ sizeof("<LineSet vertexCount=''><Coordinate point='' /></LineSet>") + defidlen\r
+ ) * 2;\r
+\r
//if (srs) size += strlen(srs) + sizeof(" srsName=..");\r
return size;\r
}\r
asx3d3_line_coords(const LWLINE *line, char *output, int precision, int opts)\r
{\r
char *ptr=output;\r
- \r
- ptr += sprintf(ptr, "");\r
+ //ptr += sprintf(ptr, "");\r
ptr += pointArray_toX3D3(line->points, ptr, precision, opts, lwline_is_closed(line));\r
return (ptr-output);\r
}\r
int i, j, k, si;\r
POINTARRAY *pa;\r
int np;\r
- \r
+\r
ptr += sprintf(ptr, "");\r
j = 0;\r
for (i=0; i < mgeom->ngeoms; i++)\r
pa = geom->points;\r
np = pa->npoints;\r
si = j; //start index of first point of linestring\r
- for(k=0; k < np ; k++){\r
- if (k) {\r
- ptr += sprintf(ptr, " "); \r
- }\r
- /** if the linestring is closed, we put the start point index \r
- * for the last vertex to denote use first point\r
- * and don't increment the index **/\r
- if (!lwline_is_closed(geom) || k < (np -1) ){\r
- ptr += sprintf(ptr, "%d", j);\r
- j += 1;\r
- }\r
- else { \r
- ptr += sprintf(ptr,"%d", si);\r
- }\r
+ for(k=0; k < np ; k++)\r
+ {\r
+ if (k)\r
+ {\r
+ ptr += sprintf(ptr, " ");\r
+ }\r
+ /** if the linestring is closed, we put the start point index\r
+ * for the last vertex to denote use first point\r
+ * and don't increment the index **/\r
+ if (!lwline_is_closed(geom) || k < (np -1) )\r
+ {\r
+ ptr += sprintf(ptr, "%d", j);\r
+ j += 1;\r
+ }\r
+ else\r
+ {\r
+ ptr += sprintf(ptr,"%d", si);\r
+ }\r
}\r
- if (i < (mgeom->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " -1 "); //separator for each linestring\r
+ if (i < (mgeom->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " -1 "); //separator for each linestring\r
}\r
}\r
return (ptr-output);\r
}\r
\r
-/* Calculate the coordIndex property of the IndexedLineSet for a multipolygon \r
+/* Calculate the coordIndex property of the IndexedLineSet for a multipolygon\r
This is not ideal -- would be really nice to just share this function with psurf, \r
but I'm not smart enough to do that yet*/\r
static size_t\r
{\r
char *ptr=output;\r
LWPOLY *patch;\r
- int i, j, k, si;\r
- POINTARRAY *pa;\r
+ int i, j, k, l, si;\r
int np;\r
- \r
- ptr += sprintf(ptr, "");\r
j = 0;\r
for (i=0; i<psur->ngeoms; i++)\r
{\r
patch = (LWPOLY *) psur->geoms[i];\r
- np = patch->rings[0]->npoints - 1;\r
- for(k=0; k < np ; k++){\r
- if (k) {\r
- ptr += sprintf(ptr, " "); \r
- }\r
- ptr += sprintf(ptr, "%d", (j + k));\r
- }\r
- if (i < (psur->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
- }\r
- j += k;\r
+ for (l=0; l < patch->nrings; l++){\r
+ np = patch->rings[l]->npoints - 1;\r
+ for(k=0; k < np ; k++)\r
+ {\r
+ if (k)\r
+ {\r
+ ptr += sprintf(ptr, " ");\r
+ }\r
+ ptr += sprintf(ptr, "%d", (j + k));\r
+ }\r
+ j += k;\r
+ if (l < (patch->nrings - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " -1 "); //separator for each inner ring I know its probably wrong - place holder for now\r
+ }\r
+ }\r
+ if (i < (psur->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
+ }\r
}\r
return (ptr-output);\r
}\r
char *ptr=output;\r
int dimension=2;\r
\r
- if (FLAGS_GET_Z(poly->flags)) dimension = 3;\r
+ if (FLAGS_GET_Z(poly->flags))\r
+ dimension = 3;\r
ptr += pointArray_toX3D3(poly->rings[0], ptr, precision, opts, 1);\r
for (i=1; i<poly->nrings; i++)\r
{\r
+ ptr += sprintf(ptr, " "); //inner ring points start\r
ptr += pointArray_toX3D3(poly->rings[i], ptr, precision, opts,1);\r
- ptr += sprintf(ptr, " ");\r
}\r
return (ptr-output);\r
}\r
size_t size;\r
size_t defidlen = strlen(defid);\r
\r
- /** 6 for the 3 sides and space to separate each side **/ \r
- size = sizeof("<IndexedTriangleSet index=''></IndexedTriangleSet>") + defidlen + 6; \r
+ /** 6 for the 3 sides and space to separate each side **/\r
+ size = sizeof("<IndexedTriangleSet index=''></IndexedTriangleSet>") + defidlen + 6;\r
size += pointArray_X3Dsize(triangle->points, precision);\r
\r
return size;\r
ptr = output;\r
x3dtype="";\r
\r
- \r
- if (type == MULTIPOINTTYPE) {\r
+\r
+ if (type == MULTIPOINTTYPE)\r
+ {\r
x3dtype = "PointSet";\r
ptr += sprintf(ptr, "<%s %s>", x3dtype, defid);\r
}\r
- else if (type == MULTILINETYPE) {\r
+ else if (type == MULTILINETYPE)\r
+ {\r
x3dtype = "IndexedLineSet";\r
ptr += sprintf(ptr, "<%s %s coordIndex='", x3dtype, defid);\r
ptr += asx3d3_mline_coordindex(col, ptr);\r
ptr += sprintf(ptr, "'>");\r
}\r
- else if (type == MULTIPOLYGONTYPE) {\r
+ else if (type == MULTIPOLYGONTYPE)\r
+ {\r
x3dtype = "IndexedFaceSet";\r
ptr += sprintf(ptr, "<%s %s coordIndex='", x3dtype, defid);\r
ptr += asx3d3_mpoly_coordindex(col,ptr);\r
size_t defidlen = strlen(defid);\r
\r
size = sizeof("<IndexedFaceSet coordIndex=''><Coordinate point='' />") + defidlen;\r
- \r
+\r
for (i=0; i<psur->ngeoms; i++)\r
{\r
size += asx3d3_poly_size(psur->geoms[i], 0, precision, opts, defid)*5; /** need to make space for coordIndex values too including -1 separating each poly**/\r
\r
/* Open outmost tag */\r
ptr += sprintf(ptr, "<IndexedFaceSet %s coordIndex='",defid);\r
- \r
+\r
j = 0;\r
for (i=0; i<psur->ngeoms; i++)\r
{\r
patch = (LWPOLY *) psur->geoms[i];\r
np = patch->rings[0]->npoints - 1;\r
- for(k=0; k < np ; k++){\r
- if (k) {\r
- ptr += sprintf(ptr, " "); \r
- }\r
- ptr += sprintf(ptr, "%d", (j + k));\r
- }\r
- if (i < (psur->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
- }\r
- j += k;\r
+ for(k=0; k < np ; k++)\r
+ {\r
+ if (k)\r
+ {\r
+ ptr += sprintf(ptr, " ");\r
+ }\r
+ ptr += sprintf(ptr, "%d", (j + k));\r
+ }\r
+ if (i < (psur->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " -1 "); //separator for each subgeom\r
+ }\r
+ j += k;\r
}\r
- \r
+\r
ptr += sprintf(ptr, "'><Coordinate point='");\r
\r
for (i=0; i<psur->ngeoms; i++)\r
{\r
ptr += asx3d3_poly_buf(psur->geoms[i], 0, ptr, precision, opts, 1, defid);\r
- if (i < (psur->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " "); //only add a trailing space if its not the last polygon in the set\r
- }\r
+ if (i < (psur->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " "); //only add a trailing space if its not the last polygon in the set\r
+ }\r
}\r
\r
/* Close outmost tag */\r
size_t defidlen = strlen(defid);\r
//int dimension=2;\r
\r
- /** Need to make space for size of additional attributes, \r
+ /** Need to make space for size of additional attributes,\r
** the coordIndex has a value for each edge for each triangle plus a space to separate so we need at least that much extra room ***/\r
size = sizeof("<IndexedTriangleSet coordIndex=''></IndexedTriangleSet>") + defidlen + tin->ngeoms*12;\r
\r
for (i=0; i<tin->ngeoms; i++)\r
{\r
ptr += sprintf(ptr, "%d %d %d", k, (k+1), (k+2));\r
- if (i < (tin->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " ");\r
+ if (i < (tin->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " ");\r
}\r
k += 3;\r
}\r
- \r
+\r
ptr += sprintf(ptr, "'><Coordinate point='");\r
for (i=0; i<tin->ngeoms; i++)\r
{\r
ptr += asx3d3_triangle_buf(tin->geoms[i], 0, ptr, precision,\r
- opts, defid);\r
- if (i < (tin->ngeoms - 1) ){\r
- ptr += sprintf(ptr, " ");\r
+ opts, defid);\r
+ if (i < (tin->ngeoms - 1) )\r
+ {\r
+ ptr += sprintf(ptr, " ");\r
}\r
}\r
\r
/* Close outmost tag */\r
\r
ptr += sprintf(ptr, "'/></IndexedTriangleSet>");\r
- \r
+\r
return (ptr-output);\r
}\r
\r
\r
size = sizeof("<MultiGeometry></MultiGeometry>") + defidlen*2;\r
\r
- if ( srs ) size += strlen(srs) + sizeof(" srsName=..");\r
+ if ( srs )\r
+ size += strlen(srs) + sizeof(" srsName=..");\r
\r
for (i=0; i<col->ngeoms; i++)\r
{\r
else\r
ptr += asx3d3_multi_buf((LWCOLLECTION*)subgeom, 0, ptr, precision, opts, defid);\r
}\r
- else \r
+ else\r
lwerror("asx3d3_collection_buf: unknown geometry type");\r
- \r
+\r
ptr += sprintf(ptr, "</%sgeometryMember>", defid);\r
}\r
\r
for (i=0; i<pa->npoints; i++)\r
{\r
/** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
- if ( !is_closed || i < (pa->npoints - 1) ){\r
+ if ( !is_closed || i < (pa->npoints - 1) )\r
+ {\r
POINT2D pt;\r
getPoint2d_p(pa, i, &pt);\r
- \r
+\r
if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
sprintf(x, "%.*f", precision, pt.x);\r
else\r
sprintf(x, "%g", pt.x);\r
trim_trailing_zeros(x);\r
- \r
+\r
if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
sprintf(y, "%.*f", precision, pt.y);\r
else\r
sprintf(y, "%g", pt.y);\r
trim_trailing_zeros(y);\r
- \r
- if ( i ) ptr += sprintf(ptr, " ");\r
+\r
+ if ( i )\r
+ ptr += sprintf(ptr, " ");\r
ptr += sprintf(ptr, "%s %s", x, y);\r
}\r
}\r
for (i=0; i<pa->npoints; i++)\r
{\r
/** Only output the point if it is not the last point of a closed object or it is a non-closed type **/\r
- if ( !is_closed || i < (pa->npoints - 1) ){\r
+ if ( !is_closed || i < (pa->npoints - 1) )\r
+ {\r
POINT4D pt;\r
getPoint4d_p(pa, i, &pt);\r
- \r
+\r
if (fabs(pt.x) < OUT_MAX_DOUBLE)\r
sprintf(x, "%.*f", precision, pt.x);\r
else\r
sprintf(x, "%g", pt.x);\r
trim_trailing_zeros(x);\r
- \r
+\r
if (fabs(pt.y) < OUT_MAX_DOUBLE)\r
sprintf(y, "%.*f", precision, pt.y);\r
else\r
sprintf(y, "%g", pt.y);\r
trim_trailing_zeros(y);\r
- \r
+\r
if (fabs(pt.z) < OUT_MAX_DOUBLE)\r
sprintf(z, "%.*f", precision, pt.z);\r
else\r
sprintf(z, "%g", pt.z);\r
trim_trailing_zeros(z);\r
- \r
- if ( i ) ptr += sprintf(ptr, " ");\r
- \r
+\r
+ if ( i )\r
+ ptr += sprintf(ptr, " ");\r
+\r
ptr += sprintf(ptr, "%s %s %s", x, y, z);\r
}\r
}\r
{\r
if (FLAGS_NDIMS(pa->flags) == 2)\r
return (OUT_MAX_DIGS_DOUBLE + precision + sizeof(" "))\r
- * 2 * pa->npoints;\r
+ * 2 * pa->npoints;\r
\r
return (OUT_MAX_DIGS_DOUBLE + precision + sizeof(" ")) * 3 * pa->npoints;\r
}
\ No newline at end of file