summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/prc/oPRCFile.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/prc/oPRCFile.cc')
-rw-r--r--Build/source/utils/asymptote/prc/oPRCFile.cc454
1 files changed, 7 insertions, 447 deletions
diff --git a/Build/source/utils/asymptote/prc/oPRCFile.cc b/Build/source/utils/asymptote/prc/oPRCFile.cc
index 99a3efe26e9..1f20a681a00 100644
--- a/Build/source/utils/asymptote/prc/oPRCFile.cc
+++ b/Build/source/utils/asymptote/prc/oPRCFile.cc
@@ -25,9 +25,10 @@
#include <iostream>
#include <fstream>
#include <iomanip>
-#include <string>
+#include <cstring>
#include <zlib.h>
-#include <string.h>
+
+namespace prc {
#define WriteUnsignedInteger( value ) out << (uint32_t)(value);
#define WriteInteger( value ) out << (int32_t)(value);
@@ -70,19 +71,8 @@
#define SerializeModelFileData serializeModelFileData(modelFile_out); modelFile_out.compress();
#define SerializeUnit( value ) (value).serializeUnit(out);
-using std::string;
using namespace std;
-// Map [0,1] to [0,255]
-inline uint8_t byte(double r)
-{
- if(r < 0.0) r=0.0;
- else if(r > 1.0) r=1.0;
- int a=(int)(256.0*r);
- if(a == 256) a=255;
- return a;
-}
-
void PRCFileStructure::serializeFileStructureGlobals(PRCbitStream &out)
{
// even though this is technically not part of this section,
@@ -401,7 +391,7 @@ uint32_t PRCHeader::getSize()
void oPRCFile::doGroup(PRCgroup& group)
{
- const string& name = group.name;
+ const std::string& name = group.name;
PRCProductOccurrence*& product_occurrence = group.product_occurrence;
PRCProductOccurrence*& parent_product_occurrence = group.parent_product_occurrence;
@@ -1070,7 +1060,7 @@ uint32_t oPRCFile::getSize()
return size;
}
-uint32_t PRCFileStructure::addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *p, uint32_t width, uint32_t height, string name)
+uint32_t PRCFileStructure::addPicture(EPRCPictureDataFormat format, uint32_t size, const uint8_t *p, uint32_t width, uint32_t height, std::string name)
{
uint8_t *data = NULL;
uint32_t components=0;
@@ -1414,15 +1404,6 @@ uint32_t oPRCFile::addMaterial(const PRCmaterial& m)
return style_index;
}
-bool isid(const double* t)
-{
- return(
- t[0]==1 && t[1]==0 && t[2]==0 && t[3]==0 &&
- t[4]==0 && t[5]==1 && t[6]==0 && t[7]==0 &&
- t[8]==0 && t[9]==0 && t[10]==1 && t[11]==0 &&
- t[12]==0 && t[13]==0 && t[14]==0 && t[15]==1 );
-}
-
void oPRCFile::begingroup(const char *name, PRCoptions *options,
const double* t)
{
@@ -1459,39 +1440,6 @@ PRCgroup& oPRCFile::findGroup()
return groups.top();
}
-#define ADDWIRE(curvtype) \
- PRCgroup &group = findGroup(); \
- group.wires.push_back(PRCwire()); \
- PRCwire &wire = group.wires.back(); \
- curvtype *curve = new curvtype; \
- wire.curve = curve; \
- wire.style = addColour(c);
-
-#define ADDFACE(surftype) \
- PRCgroup &group = findGroup(); \
- group.faces.push_back(PRCface()); \
- PRCface& face = group.faces.back(); \
- surftype *surface = new surftype; \
- face.face = new PRCFace; \
- face.face->base_surface = surface; \
- face.transparent = m.alpha < 1.0; \
- face.style = addMaterial(m);
-
-#define ADDCOMPFACE \
- PRCgroup &group = findGroup(); \
- group.compfaces.push_back(PRCcompface()); \
- PRCcompface& face = group.compfaces.back(); \
- PRCCompressedFace *compface = new PRCCompressedFace; \
- face.face = compface; \
- face.transparent = m.alpha < 1.0; \
- face.style = addMaterial(m);
-
-void oPRCFile::addPoint(const double P[3], const RGBAColour &c, double w)
-{
- PRCgroup &group = findGroup();
- group.points[addColourWidth(c,w)].push_back(PRCVector3d(P[0],P[1],P[2]));
-}
-
void oPRCFile::addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w)
{
if(n==0 || P==NULL)
@@ -1547,129 +1495,6 @@ void oPRCFile::useLines(uint32_t tess_index, uint32_t style_index, const double*
group.polywires.push_back(polyWire);
}
-void oPRCFile::addTriangles(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][3], const PRCmaterial &m,
- uint32_t nN, const double N[][3], const uint32_t NI[][3],
- uint32_t nT, const double T[][2], const uint32_t TI[][3],
- uint32_t nC, const RGBAColour C[], const uint32_t CI[][3],
- uint32_t nM, const PRCmaterial M[], const uint32_t MI[], double ca)
-{
- if(nP==0 || P==NULL || nI==0 || PI==NULL)
- return;
- const uint32_t tess_index = createTriangleMesh(nP, P, nI, PI, m, nN, N, NI, nT, T, TI, nC, C, CI, nM, M, MI, ca);
- useMesh(tess_index,m1);
-}
-
-uint32_t oPRCFile::createTriangleMesh(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][3], const uint32_t style_index,
- uint32_t nN, const double N[][3], const uint32_t NI[][3],
- uint32_t nT, const double T[][2], const uint32_t TI[][3],
- uint32_t nC, const RGBAColour C[], const uint32_t CI[][3],
- uint32_t nS, const uint32_t S[], const uint32_t SI[], double ca)
-{
- if(nP==0 || P==NULL || nI==0 || PI==NULL)
- return m1;
-
- const bool triangle_color = (nS != 0 && S != NULL && SI != NULL);
- const bool vertex_color = (nC != 0 && C != NULL && CI != NULL);
- const bool has_normals = (nN != 0 && N != NULL && NI != NULL);
- const bool textured = (nT != 0 && T != NULL && TI != NULL);
-
- PRC3DTess *tess = new PRC3DTess();
- PRCTessFace *tessFace = new PRCTessFace();
- tessFace->used_entities_flag = textured ? PRC_FACETESSDATA_TriangleTextured : PRC_FACETESSDATA_Triangle;
- tessFace->number_of_texture_coordinate_indexes = textured ? 1 : 0;
- tess->coordinates.reserve(3*nP);
- for(uint32_t i=0; i<nP; i++)
- {
- tess->coordinates.push_back(P[i][0]);
- tess->coordinates.push_back(P[i][1]);
- tess->coordinates.push_back(P[i][2]);
- }
- if(has_normals)
- {
- tess->normal_coordinate.reserve(3*nN);
- for(uint32_t i=0; i<nN; i++)
- {
- tess->normal_coordinate.push_back(N[i][0]);
- tess->normal_coordinate.push_back(N[i][1]);
- tess->normal_coordinate.push_back(N[i][2]);
- }
- }
- else
- tess->crease_angle = ca;
- if(textured)
- {
- tess->texture_coordinate.reserve(2*nT);
- for(uint32_t i=0; i<nT; i++)
- {
- tess->texture_coordinate.push_back(T[i][0]);
- tess->texture_coordinate.push_back(T[i][1]);
- }
- }
- tess->triangulated_index.reserve(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI);
- for(uint32_t i=0; i<nI; i++)
- {
- if(has_normals)
- tess->triangulated_index.push_back(3*NI[i][0]);
- if(textured)
- tess->triangulated_index.push_back(2*TI[i][0]);
- tess->triangulated_index.push_back(3*PI[i][0]);
- if(has_normals)
- tess->triangulated_index.push_back(3*NI[i][1]);
- if(textured)
- tess->triangulated_index.push_back(2*TI[i][1]);
- tess->triangulated_index.push_back(3*PI[i][1]);
- if(has_normals)
- tess->triangulated_index.push_back(3*NI[i][2]);
- if(textured)
- tess->triangulated_index.push_back(2*TI[i][2]);
- tess->triangulated_index.push_back(3*PI[i][2]);
- }
- tessFace->sizes_triangulated.push_back(nI);
- if(triangle_color)
- {
- tessFace->line_attributes.reserve(nI);
- for(uint32_t i=0; i<nI; i++)
- tessFace->line_attributes.push_back(SI[i]);
- }
- else if (style_index != m1 )
- {
- tessFace->line_attributes.push_back(style_index);
- }
- if(vertex_color)
- {
- tessFace->is_rgba=false;
- for(uint32_t i=0; i<nI; i++)
- if(1.0 != C[CI[i][0]].A || 1.0 != C[CI[i][1]].A || 1.0 != C[CI[i][2]].A)
- {
- tessFace->is_rgba=true;
- break;
- }
-
- tessFace->rgba_vertices.reserve((tessFace->is_rgba?4:3)*3*nI);
- for(uint32_t i=0; i<nI; i++)
- {
- tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].R));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].G));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[CI[i][0]].A));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].R));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].G));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[CI[i][1]].A));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].R));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].G));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[CI[i][2]].A));
- }
- }
- tess->addTessFace(tessFace);
- const uint32_t tess_index = add3DTess(tess);
- return tess_index;
-}
-
void oPRCFile::addQuads(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], const PRCmaterial &m,
uint32_t nN, const double N[][3], const uint32_t NI[][4],
uint32_t nT, const double T[][2], const uint32_t TI[][4],
@@ -1830,20 +1655,6 @@ uint32_t oPRCFile::createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI,
return tess_index;
}
-void oPRCFile::addQuad(const double P[][3], const RGBAColour C[])
-{
- PRCgroup &group = findGroup();
-
- group.quads.push_back(PRCtessquad());
- PRCtessquad &quad = group.quads.back();
- for(size_t i = 0; i < 4; i++)
- {
- quad.vertices[i].x = P[i][0];
- quad.vertices[i].y = P[i][1];
- quad.vertices[i].z = P[i][2];
- quad.colours[i] = C[i];
- }
-}
/*
void oPRCFile::addTriangle(const double P[][3], const double T[][2], uint32_t style_index)
{
@@ -1921,259 +1732,8 @@ uint32_t oPRCFile::createLines(uint32_t nP, const double P[][3], uint32_t nI, co
return tess_index;
}
-void oPRCFile::addLine(uint32_t n, const double P[][3], const RGBAColour &c, double w)
-{
- PRCgroup &group = findGroup();
- if(group.options.tess)
- {
- group.lines[w].push_back(PRCtessline());
- PRCtessline& line = group.lines[w].back();
- line.color.red = c.R;
- line.color.green = c.G;
- line.color.blue = c.B;
- for(uint32_t i=0; i<n; i++)
- line.point.push_back(PRCVector3d(P[i][0],P[i][1],P[i][2]));
- }
- else
- {
- ADDWIRE(PRCPolyLine)
- curve->point.resize(n);
- for(uint32_t i=0; i<n; i++)
- curve->point[i].Set(P[i][0],P[i][1],P[i][2]);
- curve->interval.min = 0;
- curve->interval.max = curve->point.size()-1;
- }
-}
-
-void oPRCFile::addBezierCurve(uint32_t n, const double cP[][3],
- const RGBAColour &c)
-{
- ADDWIRE(PRCNURBSCurve)
- curve->is_rational = false;
- curve->degree = 3;
- const size_t NUMBER_OF_POINTS = n;
- curve->control_point.resize(NUMBER_OF_POINTS);
- for(size_t i = 0; i < NUMBER_OF_POINTS; ++i)
- curve->control_point[i].Set(cP[i][0],cP[i][1],cP[i][2]);
- curve->knot.resize(3+NUMBER_OF_POINTS+1);
- curve->knot[0] = 1;
- for(size_t i = 1; i < 3+NUMBER_OF_POINTS; ++i)
- curve->knot[i] = (i+2)/3; // integer division is intentional
- curve->knot[3+NUMBER_OF_POINTS] = (3+NUMBER_OF_POINTS+1)/3;
-}
-
-void oPRCFile::addCurve(uint32_t d, uint32_t n, const double cP[][3], const double *k, const RGBAColour &c, const double w[])
-{
- ADDWIRE(PRCNURBSCurve)
- curve->is_rational = (w!=NULL);
- curve->degree = d;
- curve->control_point.resize(n);
- for(uint32_t i = 0; i < n; i++)
- if(w)
- curve->control_point[i].Set(cP[i][0]*w[i],cP[i][1]*w[i],cP[i][2]*w[i],w[i]);
- else
- curve->control_point[i].Set(cP[i][0],cP[i][1],cP[i][2]);
- curve->knot.resize(d+n+1);
- for(uint32_t i = 0; i < d+n+1; i++)
- curve->knot[i] = k[i];
-}
-
-void oPRCFile::addRectangle(const double P[][3], const PRCmaterial &m)
-{
- PRCgroup &group = findGroup();
- if(group.options.tess)
- {
- group.rectangles.push_back(PRCtessrectangle());
- PRCtessrectangle &rectangle = group.rectangles.back();
- rectangle.style = addMaterial(m);
- for(size_t i = 0; i < 4; i++)
- {
- rectangle.vertices[i].x = P[i][0];
- rectangle.vertices[i].y = P[i][1];
- rectangle.vertices[i].z = P[i][2];
- }
- }
- else if(group.options.compression == 0.0)
- {
- ADDFACE(PRCNURBSSurface)
-
- surface->is_rational = false;
- surface->degree_in_u = 1;
- surface->degree_in_v = 1;
- surface->control_point.resize(4);
- for(size_t i = 0; i < 4; ++i)
- {
- surface->control_point[i].x = P[i][0];
- surface->control_point[i].y = P[i][1];
- surface->control_point[i].z = P[i][2];
- }
- surface->knot_u.resize(4);
- surface->knot_v.resize(4);
- surface->knot_v[0] = surface->knot_u[0] = 1;
- surface->knot_v[1] = surface->knot_u[1] = 3;
- surface->knot_v[2] = surface->knot_u[2] = 4;
- surface->knot_v[3] = surface->knot_u[3] = 4;
- }
- else
- {
- ADDCOMPFACE
-
- compface->degree = 1;
- compface->control_point.resize(4);
- for(size_t i = 0; i < 4; ++i)
- {
- compface->control_point[i].x = P[i][0];
- compface->control_point[i].y = P[i][1];
- compface->control_point[i].z = P[i][2];
- }
- }
-}
-
-void oPRCFile::addPatch(const double cP[][3], const PRCmaterial &m)
-{
- PRCgroup &group = findGroup();
- if(group.options.compression == 0.0)
- {
- ADDFACE(PRCNURBSSurface)
-
- surface->is_rational = false;
- surface->degree_in_u = 3;
- surface->degree_in_v = 3;
- surface->control_point.resize(16);
- for(size_t i = 0; i < 16; ++i)
- {
- surface->control_point[i].x = cP[i][0];
- surface->control_point[i].y = cP[i][1];
- surface->control_point[i].z = cP[i][2];
- }
- surface->knot_u.resize(8);
- surface->knot_v.resize(8);
- surface->knot_v[0] = surface->knot_u[0] = 1;
- surface->knot_v[1] = surface->knot_u[1] = 1;
- surface->knot_v[2] = surface->knot_u[2] = 1;
- surface->knot_v[3] = surface->knot_u[3] = 1;
- surface->knot_v[4] = surface->knot_u[4] = 2;
- surface->knot_v[5] = surface->knot_u[5] = 2;
- surface->knot_v[6] = surface->knot_u[6] = 2;
- surface->knot_v[7] = surface->knot_u[7] = 2;
- }
- else
- {
- ADDCOMPFACE
-
- compface->degree = 3;
- compface->control_point.resize(16);
- for(size_t i = 0; i < 16; ++i)
- {
- compface->control_point[i].x = cP[i][0];
- compface->control_point[i].y = cP[i][1];
- compface->control_point[i].z = cP[i][2];
- }
- }
-}
-
-void oPRCFile::addSurface(uint32_t dU, uint32_t dV, uint32_t nU, uint32_t nV,
- const double cP[][3], const double *kU,
- const double *kV, const PRCmaterial &m,
- const double w[])
-{
- ADDFACE(PRCNURBSSurface)
-
- surface->is_rational = (w!=NULL);
- surface->degree_in_u = dU;
- surface->degree_in_v = dV;
- surface->control_point.resize(nU*nV);
- for(size_t i = 0; i < nU*nV; i++)
- if(w)
- surface->control_point[i]=PRCControlPoint(cP[i][0]*w[i],cP[i][1]*w[i],cP[i][2]*w[i],w[i]);
- else
- surface->control_point[i]=PRCControlPoint(cP[i][0],cP[i][1],cP[i][2]);
- surface->knot_u.insert(surface->knot_u.end(), kU, kU+(dU+nU+1));
- surface->knot_v.insert(surface->knot_v.end(), kV, kV+(dV+nV+1));
-}
-
-#define SETTRANSF \
- if(t&&!isid(t)) \
- face.transform = new PRCGeneralTransformation3d(t); \
- if(origin) surface->origin.Set(origin[0],origin[1],origin[2]); \
- if(x_axis) surface->x_axis.Set(x_axis[0],x_axis[1],x_axis[2]); \
- if(y_axis) surface->y_axis.Set(y_axis[0],y_axis[1],y_axis[2]); \
- surface->scale = scale; \
- surface->geometry_is_2D = false; \
- if(surface->origin!=PRCVector3d(0.0,0.0,0.0)) \
- surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Translate; \
- if(surface->x_axis!=PRCVector3d(1.0,0.0,0.0)||surface->y_axis!=PRCVector3d(0.0,1.0,0.0)) \
- surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Rotate; \
- if(surface->scale!=1) \
- surface->behaviour = surface->behaviour | PRC_TRANSFORMATION_Scale; \
- surface->has_transformation = (surface->behaviour != PRC_TRANSFORMATION_Identity);
-
#define PRCFACETRANSFORM const double origin[3], const double x_axis[3], const double y_axis[3], double scale, const double* t
-void oPRCFile::addTube(uint32_t n, const double cP[][3], const double oP[][3], bool straight, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCBlend01)
- SETTRANSF
- if(straight)
- {
- PRCPolyLine *center_curve = new PRCPolyLine;
- center_curve->point.resize(n);
- for(uint32_t i=0; i<n; i++)
- center_curve->point[i].Set(cP[i][0],cP[i][1],cP[i][2]);
- center_curve->interval.min = 0;
- center_curve->interval.max = center_curve->point.size()-1;
- surface->center_curve = center_curve;
-
- PRCPolyLine *origin_curve = new PRCPolyLine;
- origin_curve->point.resize(n);
- for(uint32_t i=0; i<n; i++)
- origin_curve->point[i].Set(oP[i][0],oP[i][1],oP[i][2]);
- origin_curve->interval.min = 0;
- origin_curve->interval.max = origin_curve->point.size()-1;
- surface->origin_curve = origin_curve;
-
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y = 0;
- surface->uv_domain.max.y = n-1;
- }
- else
- {
- PRCNURBSCurve *center_curve = new PRCNURBSCurve;
- center_curve->is_rational = false;
- center_curve->degree = 3;
- const uint32_t CENTER_NUMBER_OF_POINTS = n;
- center_curve->control_point.resize(CENTER_NUMBER_OF_POINTS);
- for(uint32_t i = 0; i < CENTER_NUMBER_OF_POINTS; ++i)
- center_curve->control_point[i].Set(cP[i][0],cP[i][1],cP[i][2]);
- center_curve->knot.resize(3+CENTER_NUMBER_OF_POINTS+1);
- center_curve->knot[0] = 1;
- for(uint32_t i = 1; i < 3+CENTER_NUMBER_OF_POINTS; ++i)
- center_curve->knot[i] = (i+2)/3; // integer division is intentional
- center_curve->knot[3+CENTER_NUMBER_OF_POINTS] = (3+CENTER_NUMBER_OF_POINTS+1)/3;
- surface->center_curve = center_curve;
-
- PRCNURBSCurve *origin_curve = new PRCNURBSCurve;
- origin_curve->is_rational = false;
- origin_curve->degree = 3;
- const uint32_t ORIGIN_NUMBER_OF_POINTS = n;
- origin_curve->control_point.resize(ORIGIN_NUMBER_OF_POINTS);
- for(uint32_t i = 0; i < ORIGIN_NUMBER_OF_POINTS; ++i)
- origin_curve->control_point[i].Set(oP[i][0],oP[i][1],oP[i][2]);
- origin_curve->knot.resize(3+ORIGIN_NUMBER_OF_POINTS+1);
- origin_curve->knot[0] = 1;
- for(size_t i = 1; i < 3+ORIGIN_NUMBER_OF_POINTS; ++i)
- origin_curve->knot[i] = (i+2)/3; // integer division is intentional
- origin_curve->knot[3+ORIGIN_NUMBER_OF_POINTS] = (3+ORIGIN_NUMBER_OF_POINTS+1)/3;
- surface->origin_curve = origin_curve;
-
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y = 1; // first knot
- surface->uv_domain.max.y = (3+CENTER_NUMBER_OF_POINTS+1)/3; // last knot
- }
-}
-
void oPRCFile::addHemisphere(double radius, const PRCmaterial &m, PRCFACETRANSFORM)
{
ADDFACE(PRCSphere)
@@ -2250,8 +1810,6 @@ void oPRCFile::addTorus(double major_radius, double minor_radius, double angle1,
surface->minor_radius = minor_radius;
}
-#undef PRCFACETRANSFORM
-#undef ADDFACE
#undef ADDWIRE
#undef SETTRANSF
@@ -2359,3 +1917,5 @@ uint32_t PRCFileStructure::addCoordinateSystemUnique(PRCCoordinateSystem*& pCoor
pCoordinateSystem = NULL;
return reference_coordinate_systems.size()-1;
}
+
+}