summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/prc/oPRCFile.cc
diff options
context:
space:
mode:
authorDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
committerDenis Bitouzé <dbitouze@wanadoo.fr>2021-02-25 18:23:07 +0000
commitc6101f91d071883b48b1b4b51e5eba0f36d9a78d (patch)
tree1bf7f5a881d7a4f5c5bf59d0b2821943dd822372 /Build/source/utils/asymptote/prc/oPRCFile.cc
parent07ee7222e389b0777456b427a55c22d0e6ffd267 (diff)
French translation for tlmgr updated
git-svn-id: svn://tug.org/texlive/trunk@57912 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/prc/oPRCFile.cc')
-rw-r--r--Build/source/utils/asymptote/prc/oPRCFile.cc1921
1 files changed, 0 insertions, 1921 deletions
diff --git a/Build/source/utils/asymptote/prc/oPRCFile.cc b/Build/source/utils/asymptote/prc/oPRCFile.cc
deleted file mode 100644
index 859d6597c0e..00000000000
--- a/Build/source/utils/asymptote/prc/oPRCFile.cc
+++ /dev/null
@@ -1,1921 +0,0 @@
-/************
-*
-* This file is part of a tool for producing 3D content in the PRC format.
-* Copyright (C) 2008 Orest Shardt <shardtor (at) gmail dot com> and
-* Michail Vidiassov <master@iaas.msu.ru>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-*************/
-
-#include "oPRCFile.h"
-#include <time.h>
-#include <sstream>
-#include <iostream>
-#include <fstream>
-#include <iomanip>
-#include <cstring>
-#include <zlib.h>
-
-namespace prc {
-
-#define WriteUnsignedInteger( value ) out << (uint32_t)(value);
-#define WriteInteger( value ) out << (int32_t)(value);
-#define WriteDouble( value ) out << (double)(value);
-#define WriteString( value ) out << (value);
-#define WriteUncompressedUnsignedInteger( value ) writeUncompressedUnsignedInteger(out, (uint32_t)(value));
-#define WriteUncompressedBlock( value, count ) out.write((char *)(value),(count));
-#define SerializeFileStructureUncompressedUniqueId( value ) (value).serializeFileStructureUncompressedUniqueId(out);
-#define SerializeCompressedUniqueId( value ) (value).serializeCompressedUniqueId(out);
-#define SerializeContentPRCBase write(out);
-#define SerializeRgbColor( value ) (value).serializeRgbColor(out);
-#define SerializePicture( value ) (value).serializePicture(out);
-#define SerializeTextureDefinition( value ) (value)->serializeTextureDefinition(out);
-#define SerializeMarkup( value ) (value)->serializeMarkup(out);
-#define SerializeAnnotationEntity( value ) (value)->serializeAnnotationEntity(out);
-#define SerializeFontKeysSameFont( value ) (value).serializeFontKeysSameFont(out);
-#define SerializeMaterial( value ) (value)->serializeMaterial(out);
-
-#define SerializeUserData UserData(0,0).write(out);
-#define SerializeEmptyContentPRCBase ContentPRCBase(PRC_TYPE_ROOT_PRCBase).serializeContentPRCBase(out);
-#define SerializeCategory1LineStyle( value ) (value)->serializeCategory1LineStyle(out);
-#define SerializeCoordinateSystem( value ) (value)->serializeCoordinateSystem(out);
-#define SerializeRepresentationItem( value ) (value)->serializeRepresentationItem(out);
-#define SerializePartDefinition( value ) (value)->serializePartDefinition(out);
-#define SerializeProductOccurrence( value ) (value)->serializeProductOccurrence(out);
-#define SerializeContextAndBodies( value ) (value)->serializeContextAndBodies(out);
-#define SerializeGeometrySummary( value ) (value)->serializeGeometrySummary(out);
-#define SerializeContextGraphics( value ) (value)->serializeContextGraphics(out);
-#define SerializeStartHeader serializeStartHeader(out);
-#define SerializeUncompressedFiles \
- { \
- const size_t number_of_uncompressed_files = uncompressed_files.size(); \
- WriteUncompressedUnsignedInteger (number_of_uncompressed_files) \
- for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++) \
- { \
- WriteUncompressedUnsignedInteger ((*it)->file_size) \
- WriteUncompressedBlock ((*it)->data, (*it)->file_size) \
- } \
- }
-#define SerializeModelFileData serializeModelFileData(modelFile_out); modelFile_out.compress();
-#define SerializeUnit( value ) (value).serializeUnit(out);
-
-using namespace std;
-
-void PRCFileStructure::serializeFileStructureGlobals(PRCbitStream &out)
-{
- // even though this is technically not part of this section,
- // it is handled here for convenience
- const uint32_t number_of_schema = 0;
- WriteUnsignedInteger (number_of_schema)
-
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureGlobals)
-
- PRCSingleAttribute sa((int32_t)PRCVersion);
- PRCAttribute a("__PRC_RESERVED_ATTRIBUTE_PRCInternalVersion");
- a.addKey(sa);
- ContentPRCBase cb(PRC_TYPE_ROOT_PRCBase);
- cb.addAttribute(a);
- cb.serializeContentPRCBase(out);
- WriteUnsignedInteger (number_of_referenced_file_structures)
- // SerializeFileStructureInternalGlobalData
- WriteDouble (tessellation_chord_height_ratio)
- WriteDouble (tessellation_angle_degree)
-
- // SerializeMarkupSerializationHelper
- WriteString (default_font_family_name)
-
- const size_t number_of_fonts = font_keys_of_font.size();
- WriteUnsignedInteger (number_of_fonts)
- for (size_t i=0;i<number_of_fonts;i++)
- {
- SerializeFontKeysSameFont (font_keys_of_font[i])
- }
-
- const size_t number_of_colors = colors.size();
- WriteUnsignedInteger (number_of_colors)
- for (size_t i=0;i<number_of_colors;i++)
- SerializeRgbColor (colors[i])
-
- const size_t number_of_pictures = pictures.size();
- WriteUnsignedInteger (number_of_pictures)
- for (uint32_t i=0;i<number_of_pictures;i++)
- SerializePicture (pictures[i])
-
- const size_t number_of_texture_definitions = texture_definitions.size();
- WriteUnsignedInteger (number_of_texture_definitions)
- for (size_t i=0;i<number_of_texture_definitions;i++)
- SerializeTextureDefinition (texture_definitions[i])
-
- const size_t number_of_materials = materials.size();
- WriteUnsignedInteger (number_of_materials)
- for (size_t i=0;i<number_of_materials;i++)
- SerializeMaterial (materials[i])
-
- // number of line patterns hard coded for now
- const uint32_t number_of_line_patterns = 1;
- WriteUnsignedInteger (number_of_line_patterns)
- PRCLinePattern().serializeLinePattern(out);
-
- const size_t number_of_styles = styles.size();
- WriteUnsignedInteger (number_of_styles)
- for (size_t i=0;i<number_of_styles;i++)
- SerializeCategory1LineStyle (styles[i])
-
- const size_t number_of_fill_patterns = 0;
- WriteUnsignedInteger (number_of_fill_patterns)
-
- const size_t number_of_reference_coordinate_systems = reference_coordinate_systems.size();
- WriteUnsignedInteger (number_of_reference_coordinate_systems)
- for (size_t i=0;i<number_of_reference_coordinate_systems;i++)
- SerializeCoordinateSystem (reference_coordinate_systems[i])
-
- SerializeUserData
-}
-
-void PRCFileStructure::serializeFileStructureTree(PRCbitStream &out)
-{
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureTree)
-
- SerializeEmptyContentPRCBase
-
- const size_t number_of_part_definitions = part_definitions.size();
- WriteUnsignedInteger (number_of_part_definitions)
- for (size_t i=0;i<number_of_part_definitions;i++)
- SerializePartDefinition (part_definitions[i])
-
- const size_t number_of_product_occurrences = product_occurrences.size();
- WriteUnsignedInteger (number_of_product_occurrences)
- for (size_t i=0;i<number_of_product_occurrences;i++)
- {
- product_occurrences[i]->unit_information.unit_from_CAD_file = true;
- product_occurrences[i]->unit_information.unit = unit;
- SerializeProductOccurrence (product_occurrences[i])
- }
-
- // SerializeFileStructureInternalData
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructure)
- SerializeEmptyContentPRCBase
- const uint32_t next_available_index = makePRCID();
- WriteUnsignedInteger (next_available_index)
- const size_t index_product_occurence = number_of_product_occurrences; // Asymptote (oPRCFile) specific - we write the root product last
- WriteUnsignedInteger (index_product_occurence)
-
- SerializeUserData
-}
-
-void PRCFileStructure::serializeFileStructureTessellation(PRCbitStream &out)
-{
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureTessellation)
-
- SerializeEmptyContentPRCBase
- const size_t number_of_tessellations = tessellations.size();
- WriteUnsignedInteger (number_of_tessellations)
- for (size_t i=0;i<number_of_tessellations;i++)
- tessellations[i]->serializeBaseTessData(out);
-
- SerializeUserData
-}
-
-void PRCFileStructure::serializeFileStructureGeometry(PRCbitStream &out)
-{
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureGeometry)
-
- SerializeEmptyContentPRCBase
- const size_t number_of_contexts = contexts.size();
- WriteUnsignedInteger (number_of_contexts)
- for (size_t i=0;i<number_of_contexts;i++)
- SerializeContextAndBodies (contexts[i])
-
- SerializeUserData
-}
-
-void PRCFileStructure::serializeFileStructureExtraGeometry(PRCbitStream &out)
-{
- WriteUnsignedInteger (PRC_TYPE_ASM_FileStructureExtraGeometry)
-
- SerializeEmptyContentPRCBase
- const size_t number_of_contexts = contexts.size();
- WriteUnsignedInteger (number_of_contexts)
- for (size_t i=0;i<number_of_contexts;i++)
- {
- SerializeGeometrySummary (contexts[i])
- SerializeContextGraphics (contexts[i])
- }
-
- SerializeUserData
-}
-
-void oPRCFile::serializeModelFileData(PRCbitStream &out)
-{
- // even though this is technically not part of this section,
- // it is handled here for convenience
- const uint32_t number_of_schema = 0;
- WriteUnsignedInteger (number_of_schema)
- WriteUnsignedInteger (PRC_TYPE_ASM_ModelFile)
-
- PRCSingleAttribute sa((int32_t)PRCVersion);
- PRCAttribute a("__PRC_RESERVED_ATTRIBUTE_PRCInternalVersion");
- a.addKey(sa);
- ContentPRCBase cb(PRC_TYPE_ROOT_PRCBase,"PRC file");
- cb.addAttribute(a);
- cb.serializeContentPRCBase(out);
-
- SerializeUnit (unit)
-
- out << (uint32_t)1; // 1 product occurrence
- //UUID
- SerializeCompressedUniqueId( fileStructures[0]->file_structure_uuid )
- // index+1
- out << (uint32_t)fileStructures[0]->product_occurrences.size();
- // active
- out << true;
- out << (uint32_t)0; // index in model file
-
- SerializeUserData
-}
-
-void makeFileUUID(PRCUniqueId& UUID)
-{
- // make a UUID
- static uint32_t count = 0;
- ++count;
- // the minimum requirement on UUIDs is that all must be unique in the file
- UUID.id0 = 0x33595341; // some constant
- UUID.id1 = (uint32_t)time(NULL); // the time
- UUID.id2 = count;
- UUID.id3 = 0xa5a55a5a; // Something random, not seeded by the time, would be nice. But for now, a constant
- // maybe add something else to make it more unique
- // so multiple files can be combined
- // a hash of some data perhaps?
-}
-
-void makeAppUUID(PRCUniqueId& UUID)
-{
- UUID.id0 = UUID.id1 = UUID.id2 = UUID.id3 = 0;
-}
-
-void PRCUncompressedFile::write(ostream &out) const
-{
- if(data!=NULL)
- {
- WriteUncompressedUnsignedInteger (file_size)
- out.write((char*)data,file_size);
- }
-}
-
-uint32_t PRCUncompressedFile::getSize() const
-{
- return sizeof(file_size)+file_size;
-}
-
-
-void PRCStartHeader::serializeStartHeader(ostream &out) const
-{
- WriteUncompressedBlock ("PRC",3)
- WriteUncompressedUnsignedInteger (minimal_version_for_read)
- WriteUncompressedUnsignedInteger (authoring_version)
- SerializeFileStructureUncompressedUniqueId( file_structure_uuid );
- SerializeFileStructureUncompressedUniqueId( application_uuid );
-}
-
-uint32_t PRCStartHeader::getStartHeaderSize() const
-{
- return 3+(2+2*4)*sizeof(uint32_t);
-}
-
-
-void PRCFileStructure::write(ostream &out)
-{
- // SerializeFileStructureHeader
- SerializeStartHeader
- SerializeUncompressedFiles
- globals_out.write(out);
- tree_out.write(out);
- tessellations_out.write(out);
- geometry_out.write(out);
- extraGeometry_out.write(out);
-}
-
-#define SerializeFileStructureGlobals serializeFileStructureGlobals(globals_out); globals_out.compress(); sizes[1]=globals_out.getSize();
-#define SerializeFileStructureTree serializeFileStructureTree(tree_out); tree_out.compress(); sizes[2]=tree_out.getSize();
-#define SerializeFileStructureTessellation serializeFileStructureTessellation(tessellations_out); tessellations_out.compress(); sizes[3]=tessellations_out.getSize();
-#define SerializeFileStructureGeometry serializeFileStructureGeometry(geometry_out); geometry_out.compress(); sizes[4]=geometry_out.getSize();
-#define SerializeFileStructureExtraGeometry serializeFileStructureExtraGeometry(extraGeometry_out); extraGeometry_out.compress(); sizes[5]=extraGeometry_out.getSize();
-#define FlushSerialization resetGraphicsAndName();
-void PRCFileStructure::prepare()
-{
- uint32_t size = 0;
- size += getStartHeaderSize();
- size += sizeof(uint32_t);
- for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++)
- size += (*it)->getSize();
- sizes[0]=size;
-
- SerializeFileStructureGlobals
- FlushSerialization
-
- SerializeFileStructureTree
- FlushSerialization
-
- SerializeFileStructureTessellation
- FlushSerialization
-
- SerializeFileStructureGeometry
- FlushSerialization
-
- SerializeFileStructureExtraGeometry
- FlushSerialization
-}
-
-uint32_t PRCFileStructure::getSize()
-{
- uint32_t size = 0;
- for(size_t i=0; i<6; i++)
- size += sizes[i];
- return size;
-}
-
-
-void PRCFileStructureInformation::write(ostream &out)
-{
- SerializeFileStructureUncompressedUniqueId( UUID );
-
- WriteUncompressedUnsignedInteger (reserved)
- WriteUncompressedUnsignedInteger (number_of_offsets)
- for(uint32_t i = 0; i < number_of_offsets; ++i)
- {
- WriteUncompressedUnsignedInteger (offsets[i])
- }
-}
-
-uint32_t PRCFileStructureInformation::getSize()
-{
- return (4+2+number_of_offsets)*sizeof(uint32_t);
-}
-
-void PRCHeader::write(ostream &out)
-{
- SerializeStartHeader
- WriteUncompressedUnsignedInteger (number_of_file_structures)
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- {
- fileStructureInformation[i].write(out);
- }
- WriteUncompressedUnsignedInteger (model_file_offset)
- WriteUncompressedUnsignedInteger (file_size)
- SerializeUncompressedFiles
-}
-
-uint32_t PRCHeader::getSize()
-{
- uint32_t size = getStartHeaderSize() + sizeof(uint32_t);
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- size += fileStructureInformation[i].getSize();
- size += 3*sizeof(uint32_t);
- for(PRCUncompressedFileList::const_iterator it = uncompressed_files.begin(); it != uncompressed_files.end(); it++)
- size += (*it)->getSize();
- return size;
-}
-
-void oPRCFile::doGroup(PRCgroup& group)
-{
- const std::string& name = group.name;
-
- PRCProductOccurrence*& product_occurrence = group.product_occurrence;
- PRCProductOccurrence*& parent_product_occurrence = group.parent_product_occurrence;
- PRCPartDefinition*& part_definition = group.part_definition;
- PRCPartDefinition*& parent_part_definition = group.parent_part_definition;
-
- if(group.options.tess)
- {
- if(!group.lines.empty())
- {
- for(PRCtesslineMap::const_iterator wit=group.lines.begin(); wit!=group.lines.end(); wit++)
- {
- bool same_color = true;
- const PRCtesslineList& lines = wit->second;
- const PRCRgbColor &color = lines.front().color;
- for(PRCtesslineList::const_iterator lit=lines.begin(); lit!=lines.end(); lit++)
- if(color!=lit->color)
- {
- same_color = false;
- break;
- }
- map<PRCVector3d,uint32_t> points;
- PRC3DWireTess *tess = new PRC3DWireTess();
- if(!same_color)
- {
- tess->is_segment_color = true;
- tess->is_rgba = false;
- }
- for(PRCtesslineList::const_iterator lit=lines.begin(); lit!=lines.end(); lit++)
- {
- tess->wire_indexes.push_back(static_cast<uint32_t>(lit->point.size()));
- for(uint32_t i=0; i<lit->point.size(); i++)
- {
- map<PRCVector3d,uint32_t>::iterator pPoint = points.find(lit->point[i]);
- if(pPoint!=points.end())
- tess->wire_indexes.push_back(pPoint->second);
- else
- {
- const uint32_t point_index = static_cast<uint32_t>(tess->coordinates.size());
- points.insert(make_pair(lit->point[i],point_index));
- tess->wire_indexes.push_back(point_index);
- tess->coordinates.push_back(lit->point[i].x);
- tess->coordinates.push_back(lit->point[i].y);
- tess->coordinates.push_back(lit->point[i].z);
- }
- if(!same_color && i>0)
- {
- tess->rgba_vertices.push_back(byte(lit->color.red));
- tess->rgba_vertices.push_back(byte(lit->color.green));
- tess->rgba_vertices.push_back(byte(lit->color.blue));
- }
- }
- }
- const uint32_t tess_index = add3DWireTess(tess);
- PRCPolyWire *polyWire = new PRCPolyWire();
- polyWire->index_tessellation = tess_index;
- if(same_color)
- polyWire->index_of_line_style = addColourWidth(RGBAColour(color.red,color.green,color.blue),wit->first);
- else
- polyWire->index_of_line_style = addColourWidth(RGBAColour(1,1,1),wit->first);
- part_definition->addPolyWire(polyWire);
- }
- }
-// make rectangles pairs of triangles in a tesselation
- if(!group.rectangles.empty())
- {
- bool same_color = true;
- const uint32_t &style = group.rectangles.front().style;
- for(PRCtessrectangleList::const_iterator rit=group.rectangles.begin(); rit!=group.rectangles.end(); rit++)
- if(style!=rit->style)
- {
- same_color = false;
- break;
- }
- map<PRCVector3d,uint32_t> points;
- PRC3DTess *tess = new PRC3DTess();
- tess->crease_angle = group.options.crease_angle;
- PRCTessFace *tessFace = new PRCTessFace();
- tessFace->used_entities_flag=PRC_FACETESSDATA_Triangle;
- uint32_t triangles = 0;
- for(PRCtessrectangleList::const_iterator rit=group.rectangles.begin(); rit!=group.rectangles.end(); rit++)
- {
- const bool degenerate = (rit->vertices[0]==rit->vertices[1]);
- uint32_t vertex_indices[4];
- for(size_t i = (degenerate?1:0); i < 4; ++i)
- {
- map<PRCVector3d,uint32_t>::const_iterator pPoint = points.find(rit->vertices[i]);
- if(pPoint!=points.end())
- vertex_indices[i] = pPoint->second;
- else
- {
- points.insert(make_pair(rit->vertices[i],(vertex_indices[i] = static_cast<uint32_t>(tess->coordinates.size()))));
- tess->coordinates.push_back(rit->vertices[i].x);
- tess->coordinates.push_back(rit->vertices[i].y);
- tess->coordinates.push_back(rit->vertices[i].z);
- }
- }
- if(degenerate)
- {
- tess->triangulated_index.push_back(vertex_indices[1]);
- tess->triangulated_index.push_back(vertex_indices[2]);
- tess->triangulated_index.push_back(vertex_indices[3]);
- triangles++;
- if(!same_color)
- tessFace->line_attributes.push_back(rit->style);
- }
- else
- {
- tess->triangulated_index.push_back(vertex_indices[0]);
- tess->triangulated_index.push_back(vertex_indices[2]);
- tess->triangulated_index.push_back(vertex_indices[3]);
- triangles++;
- if(!same_color)
- tessFace->line_attributes.push_back(rit->style);
- tess->triangulated_index.push_back(vertex_indices[3]);
- tess->triangulated_index.push_back(vertex_indices[1]);
- tess->triangulated_index.push_back(vertex_indices[0]);
- triangles++;
- if(!same_color)
- tessFace->line_attributes.push_back(rit->style);
- }
- }
- tessFace->sizes_triangulated.push_back(triangles);
- tess->addTessFace(tessFace);
- const uint32_t tess_index = add3DTess(tess);
- PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel();
- polyBrepModel->index_tessellation = tess_index;
- polyBrepModel->is_closed = group.options.closed;
- if(same_color)
- polyBrepModel->index_of_line_style = style;
- part_definition->addPolyBrepModel(polyBrepModel);
- }
- }
-
- if(!group.quads.empty())
- {
- map<PRCVector3d,uint32_t> points;
- PRC3DTess *tess = new PRC3DTess();
- tess->crease_angle = group.options.crease_angle;
- PRCTessFace *tessFace = new PRCTessFace();
- tessFace->used_entities_flag=PRC_FACETESSDATA_Triangle;
- uint32_t triangles = 0;
-
- tessFace->is_rgba = false;
- for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++)
- {
- const RGBAColour* C = qit->colours;
- if(C[0].A != 1.0 || C[1].A != 1.0 || C[2].A != 1.0 || C[3].A != 1.0)
- {
- tessFace->is_rgba = true;
- break;
- }
- }
- bool same_colour = true;
- const RGBAColour& colour = group.quads.front().colours[0];
- for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++)
- {
- const RGBAColour* C = qit->colours;
- if(colour!=C[0] || colour!=C[1] || colour!=C[2] || colour!=C[3])
- {
- same_colour = false;
- break;
- }
- }
-
- for(PRCtessquadList::const_iterator qit=group.quads.begin(); qit!=group.quads.end(); qit++)
- {
- const RGBAColour* C = qit->colours;
- const bool degenerate = (qit->vertices[0]==qit->vertices[1]);
- uint32_t vertex_indices[4];
- for(size_t i = (degenerate?1:0); i < 4; ++i)
- {
- map<PRCVector3d,uint32_t>::const_iterator pPoint = points.find(qit->vertices[i]);
- if(pPoint!=points.end())
- vertex_indices[i] = pPoint->second;
- else
- {
- points.insert(make_pair(qit->vertices[i],(vertex_indices[i] = static_cast<uint32_t>(tess->coordinates.size()))));
- tess->coordinates.push_back(qit->vertices[i].x);
- tess->coordinates.push_back(qit->vertices[i].y);
- tess->coordinates.push_back(qit->vertices[i].z);
- }
- }
- if(degenerate)
- {
- tess->triangulated_index.push_back(vertex_indices[1]);
- tess->triangulated_index.push_back(vertex_indices[2]);
- tess->triangulated_index.push_back(vertex_indices[3]);
- triangles++;
- if(!same_colour)
- {
- tessFace->rgba_vertices.push_back(byte(C[1].R));
- tessFace->rgba_vertices.push_back(byte(C[1].G));
- tessFace->rgba_vertices.push_back(byte(C[1].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[1].A));
-
- tessFace->rgba_vertices.push_back(byte(C[2].R));
- tessFace->rgba_vertices.push_back(byte(C[2].G));
- tessFace->rgba_vertices.push_back(byte(C[2].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[2].A));
-
- tessFace->rgba_vertices.push_back(byte(C[3].R));
- tessFace->rgba_vertices.push_back(byte(C[3].G));
- tessFace->rgba_vertices.push_back(byte(C[3].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[3].A));
- }
- }
- else
- {
- tess->triangulated_index.push_back(vertex_indices[0]);
- tess->triangulated_index.push_back(vertex_indices[2]);
- tess->triangulated_index.push_back(vertex_indices[3]);
- triangles++;
- if(!same_colour)
- {
- tessFace->rgba_vertices.push_back(byte(C[0].R));
- tessFace->rgba_vertices.push_back(byte(C[0].G));
- tessFace->rgba_vertices.push_back(byte(C[0].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[0].A));
-
- tessFace->rgba_vertices.push_back(byte(C[2].R));
- tessFace->rgba_vertices.push_back(byte(C[2].G));
- tessFace->rgba_vertices.push_back(byte(C[2].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[2].A));
-
- tessFace->rgba_vertices.push_back(byte(C[3].R));
- tessFace->rgba_vertices.push_back(byte(C[3].G));
- tessFace->rgba_vertices.push_back(byte(C[3].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[3].A));
- }
- tess->triangulated_index.push_back(vertex_indices[3]);
- tess->triangulated_index.push_back(vertex_indices[1]);
- tess->triangulated_index.push_back(vertex_indices[0]);
- triangles++;
- if(!same_colour)
- {
- tessFace->rgba_vertices.push_back(byte(C[3].R));
- tessFace->rgba_vertices.push_back(byte(C[3].G));
- tessFace->rgba_vertices.push_back(byte(C[3].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[3].A));
-
- tessFace->rgba_vertices.push_back(byte(C[1].R));
- tessFace->rgba_vertices.push_back(byte(C[1].G));
- tessFace->rgba_vertices.push_back(byte(C[1].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[1].A));
-
- tessFace->rgba_vertices.push_back(byte(C[0].R));
- tessFace->rgba_vertices.push_back(byte(C[0].G));
- tessFace->rgba_vertices.push_back(byte(C[0].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[0].A));
- }
- }
- }
- tessFace->sizes_triangulated.push_back(triangles);
- tess->addTessFace(tessFace);
- const uint32_t tess_index = add3DTess(tess);
- PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel();
- polyBrepModel->index_tessellation = tess_index;
- polyBrepModel->is_closed = group.options.closed;
- if(same_colour)
- polyBrepModel->index_of_line_style = addColour(colour);
- part_definition->addPolyBrepModel(polyBrepModel);
- }
-
- if(!group.points.empty())
- {
- for(PRCpointsetMap::const_iterator pit=group.points.begin(); pit!=group.points.end(); pit++)
- {
- PRCPointSet *pointset = new PRCPointSet();
- pointset->index_of_line_style = pit->first;
- pointset->point = pit->second;
- part_definition->addPointSet(pointset);
- }
- }
-
- if(!group.pointsets.empty())
- {
- for(std::vector<PRCPointSet*>::iterator pit=group.pointsets.begin(); pit!=group.pointsets.end(); pit++)
- {
- part_definition->addPointSet(*pit);
- }
- }
-
- if(!group.polymodels.empty())
- {
- for(std::vector<PRCPolyBrepModel*>::iterator pit=group.polymodels.begin(); pit!=group.polymodels.end(); pit++)
- {
- (*pit)->is_closed = group.options.closed;
- part_definition->addPolyBrepModel(*pit);
- }
- }
-
- if(!group.polywires.empty())
- {
- for(std::vector<PRCPolyWire*>::iterator pit=group.polywires.begin(); pit!=group.polywires.end(); pit++)
- {
- part_definition->addPolyWire(*pit);
- }
- }
-
- if(!group.wires.empty())
- {
- PRCTopoContext *wireContext = NULL;
- const uint32_t context_index = getTopoContext(wireContext);
- for(PRCwireList::iterator wit=group.wires.begin(); wit!=group.wires.end(); wit++)
- {
- PRCWireEdge *wireEdge = new PRCWireEdge;
- wireEdge->curve_3d = wit->curve;
- PRCSingleWireBody *wireBody = new PRCSingleWireBody;
- wireBody->setWireEdge(wireEdge);
- const uint32_t wire_body_index = wireContext->addSingleWireBody(wireBody);
- PRCWire *wire = new PRCWire();
- wire->index_of_line_style = wit->style;
- wire->context_id = context_index;
- wire->body_id = wire_body_index;
- if(wit->transform)
- wire->index_local_coordinate_system = addTransform(wit->transform);
- part_definition->addWire(wire);
- }
- }
-
- PRCfaceList &faces = group.faces;
- if(!faces.empty())
- {
- bool same_color = true;
- const uint32_t style = faces.front().style;
- for(PRCfaceList::const_iterator fit=faces.begin(); fit!=faces.end(); fit++)
- if(style!=fit->style)
- {
- same_color = false;
- break;
- }
- PRCTopoContext *context = NULL;
- const uint32_t context_index = getTopoContext(context);
- context->granularity = group.options.granularity;
- // Acrobat 9 also does the following:
- // context->tolerance = group.options.granularity;
- // context->have_smallest_face_thickness = true;
- // context->smallest_thickness = group.options.granularity;
- PRCShell *shell = new PRCShell;
-
- for(PRCfaceList::iterator fit=faces.begin(); fit!=faces.end(); fit++)
- {
- if(fit->transform || group.options.do_break ||
- (fit->transparent && !group.options.no_break))
- {
- PRCShell *shell = new PRCShell;
- shell->addFace(fit->face);
- PRCConnex *connex = new PRCConnex;
- connex->addShell(shell);
- PRCBrepData *body = new PRCBrepData;
- body->addConnex(connex);
- const uint32_t body_index = context->addBrepData(body);
-
- PRCBrepModel *brepmodel = new PRCBrepModel();
- brepmodel->index_of_line_style = fit->style;
- brepmodel->context_id = context_index;
- brepmodel->body_id = body_index;
- brepmodel->is_closed = group.options.closed;
-
- brepmodel->index_local_coordinate_system = addTransform(fit->transform);
-
- part_definition->addBrepModel(brepmodel);
- }
- else
- {
- if(!same_color)
- fit->face->index_of_line_style = fit->style;
- shell->addFace(fit->face);
- }
- }
- if(shell->face.empty())
- {
- delete shell;
- }
- else
- {
- PRCConnex *connex = new PRCConnex;
- connex->addShell(shell);
- PRCBrepData *body = new PRCBrepData;
- body->addConnex(connex);
- const uint32_t body_index = context->addBrepData(body);
- PRCBrepModel *brepmodel = new PRCBrepModel();
- if(same_color)
- brepmodel->index_of_line_style = style;
- brepmodel->context_id = context_index;
- brepmodel->body_id = body_index;
- brepmodel->is_closed = group.options.closed;
- part_definition->addBrepModel(brepmodel);
- }
- }
-
- PRCcompfaceList &compfaces = group.compfaces;
- if(!compfaces.empty())
- {
- bool same_color = true;
- const uint32_t style = compfaces.front().style;
- for(PRCcompfaceList::const_iterator fit=compfaces.begin(); fit!=compfaces.end(); fit++)
- if(style!=fit->style)
- {
- same_color = false;
- break;
- }
- PRCTopoContext *context = NULL;
- const uint32_t context_index = getTopoContext(context);
- PRCCompressedBrepData *body = new PRCCompressedBrepData;
-
- body->serial_tolerance=group.options.compression;
- body->brep_data_compressed_tolerance=0.1*group.options.compression;
-
- for(PRCcompfaceList::const_iterator fit=compfaces.begin(); fit!=compfaces.end(); fit++)
- {
- if(group.options.do_break ||
- (fit->transparent && !group.options.no_break))
- {
- PRCCompressedBrepData *body = new PRCCompressedBrepData;
- body->face.push_back(fit->face);
-
- body->serial_tolerance=group.options.compression;
- body->brep_data_compressed_tolerance=2.8346456*
- group.options.compression;
- const uint32_t body_index = context->addCompressedBrepData(body);
-
- PRCBrepModel *brepmodel = new PRCBrepModel();
- brepmodel->index_of_line_style = fit->style;
- brepmodel->context_id = context_index;
- brepmodel->body_id = body_index;
- brepmodel->is_closed = group.options.closed;
-
- part_definition->addBrepModel(brepmodel);
- }
- else
- {
- if(!same_color)
- fit->face->index_of_line_style = fit->style;
- body->face.push_back(fit->face);
- }
- }
- if(body->face.empty())
- {
- delete body;
- }
- else
- {
- const uint32_t body_index = context->addCompressedBrepData(body);
- PRCBrepModel *brepmodel = new PRCBrepModel();
- if(same_color)
- brepmodel->index_of_line_style = style;
- brepmodel->context_id = context_index;
- brepmodel->body_id = body_index;
- brepmodel->is_closed = group.options.closed;
- part_definition->addBrepModel(brepmodel);
- }
- }
-
- // Simplify and reduce to as simple entities as possible
- // products with named representation items can not be reduced to sets, since
- // outside references are already set
- bool nonamedparts = true;
- for(PRCRepresentationItemList::const_iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++)
- {
- if (!(*it)->name.empty())
- {
- nonamedparts = false;
- break;
- }
- }
- lastgroupname.clear();
- lastgroupnames.clear();
- // First option - reduce to one element in parent
- if (parent_part_definition && product_occurrence->index_son_occurrence.empty() &&
- part_definition->representation_item.size() == 1 &&
- ( name.empty() || part_definition->representation_item.front()->name.empty() ) &&
- ( !group.transform || part_definition->representation_item.front()->index_local_coordinate_system==m1) )
- {
- if(part_definition->representation_item.front()->name.empty() )
- part_definition->representation_item.front()->name = name;
- if(part_definition->representation_item.front()->index_local_coordinate_system==m1)
- part_definition->representation_item.front()->index_local_coordinate_system = addTransform(group.transform);
- lastgroupname = calculate_unique_name(part_definition->representation_item.front(), parent_product_occurrence);
- parent_part_definition->addRepresentationItem(part_definition->representation_item.front());
- part_definition->representation_item.clear();
- delete product_occurrence; product_occurrence = NULL;
- delete part_definition; part_definition = NULL;
- }
- // Second option - reduce to a set
- else if (parent_part_definition && product_occurrence->index_son_occurrence.empty() &&
- !part_definition->representation_item.empty() &&
- !group.options.do_break && nonamedparts)
- {
- PRCSet *set = new PRCSet(name);
- set->index_local_coordinate_system = addTransform(group.transform);
- lastgroupname = calculate_unique_name(set, parent_product_occurrence);
- for(PRCRepresentationItemList::iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++)
- {
- lastgroupnames.push_back(calculate_unique_name(*it, parent_product_occurrence));
- set->addRepresentationItem(*it);
- }
- part_definition->representation_item.clear();
- parent_part_definition->addSet(set);
- delete product_occurrence; product_occurrence = NULL;
- delete part_definition; part_definition = NULL;
- }
- // Third option - create product
- else if ( !product_occurrence->index_son_occurrence.empty() || !part_definition->representation_item.empty())
- {
- // if everything is enclosed in one group - drop the root group
- if (parent_product_occurrence == NULL && group.transform == NULL &&
- part_definition->representation_item.empty() && product_occurrence->index_son_occurrence.size()==1) {
- delete part_definition; part_definition = NULL;
- delete product_occurrence; product_occurrence = NULL;
- }
- else
- {
- lastgroupname = calculate_unique_name(product_occurrence, NULL);
- if (part_definition->representation_item.empty()) {
- delete part_definition; part_definition = NULL;
- }
- else
- {
- for(PRCRepresentationItemList::const_iterator it=part_definition->representation_item.begin(); it!=part_definition->representation_item.end(); it++)
- if ((*it)->name.empty())
- lastgroupnames.push_back(calculate_unique_name(*it, product_occurrence));
- product_occurrence->index_part = addPartDefinition(part_definition);
- }
- if (group.transform) {
- product_occurrence->location = group.transform;
- group.transform = NULL;
- }
- if (parent_product_occurrence) {
- parent_product_occurrence->index_son_occurrence.push_back(addProductOccurrence(product_occurrence));
- }
- else {
- addProductOccurrence(product_occurrence);
- }
- }
- }
- // Last case - absolutely nothing to do
- else
- {
- delete product_occurrence; product_occurrence = NULL;
- delete part_definition; part_definition = NULL;
- }
-
-}
-
-std::string oPRCFile::calculate_unique_name(const ContentPRCBase *prc_entity,const ContentPRCBase *prc_occurence)
-{
- std::stringstream ss (std::stringstream::in | std::stringstream::out);
- uint8_t *serialization_buffer = NULL;
- PRCbitStream serialization(serialization_buffer,0u);
- const PRCFileStructure *pfile_structure = fileStructures[0];
- const PRCUniqueId& uuid = pfile_structure->file_structure_uuid;
-// ConvertUniqueIdentifierToString (prc_entity)
-// SerializeCompressedUniqueId (file_structure)
- serialization << uuid.id0 << uuid.id1 << uuid.id2 << uuid.id3;
-// WriteUnsignedInteger (type)
- serialization << prc_entity->getType();
-// WriteUnsignedInteger (unique_identifier)
- serialization << prc_entity->getPRCID();
- if (prc_occurence)
- {
-// serialization_buffer = Flush serialization (serialization)
- {
- const uint32_t size_serialization = serialization.getSize();
- while(size_serialization == serialization.getSize())
- serialization << false;
- }
-// ConvertUniqueIdentifierToString (prc_occurrence_unique_id)
-// SerializeCompressedUniqueId (file_structure)
- serialization << uuid.id0 << uuid.id1 << uuid.id2 << uuid.id3;
-// WriteUnsignedInteger (type)
- serialization << (uint32_t)PRC_TYPE_ASM_ProductOccurence;
-// WriteUnsignedInteger (unique_identifier)
- serialization << prc_occurence->getPRCID();
- }
- ss << (prc_entity->name.empty()?"node":prc_entity->name) << '.';
- const uint32_t size_serialization = serialization.getSize();
- for(size_t j=0; j<size_serialization; j++)
- ss << hex << setfill('0') << setw(2) << (uint32_t)(serialization_buffer[j]);
-
- return ss.str();
-}
-
-bool oPRCFile::finish()
-{
- if(groups.size()!=1) {
- fputs("begingroup without matching endgroup",stderr);
- exit(1);
- }
- doGroup(groups.top());
-
- // write each section's bit data
- fileStructures[0]->prepare();
- SerializeModelFileData
-
- // create the header
-
- // fill out enough info so that sizes can be computed correctly
- header.number_of_file_structures = number_of_file_structures;
- header.fileStructureInformation = new PRCFileStructureInformation[number_of_file_structures];
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- {
- header.fileStructureInformation[i].UUID = fileStructures[i]->file_structure_uuid;
- header.fileStructureInformation[i].reserved = 0;
- header.fileStructureInformation[i].number_of_offsets = 6;
- header.fileStructureInformation[i].offsets = new uint32_t[6];
- }
-
- header.minimal_version_for_read = PRCVersion;
- header.authoring_version = PRCVersion;
- makeFileUUID(header.file_structure_uuid);
- makeAppUUID(header.application_uuid);
-
- header.file_size = getSize();
- header.model_file_offset = header.file_size - modelFile_out.getSize();
-
- uint32_t currentOffset = header.getSize();
-
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- {
- for(size_t j=0; j<6; j++)
- {
- header.fileStructureInformation[i].offsets[j] = currentOffset;
- currentOffset += fileStructures[i]->sizes[j];
- }
- }
-
- // write the data
- header.write(output);
-
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- {
- fileStructures[i]->write(output);
- }
-
- modelFile_out.write(output);
- output.flush();
-
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- delete[] header.fileStructureInformation[i].offsets;
- delete[] header.fileStructureInformation;
-
- return true;
-}
-
-uint32_t oPRCFile::getSize()
-{
- uint32_t size = header.getSize();
-
- for(uint32_t i = 0; i < number_of_file_structures; ++i)
- {
- size += fileStructures[i]->getSize();
- }
-
- size += modelFile_out.getSize();
- return size;
-}
-
-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;
- PRCPicture picture(name);
- if(size==0 || p==NULL)
- { cerr << "image not set" << endl; return m1; }
- PRCUncompressedFile* uncompressed_file = new PRCUncompressedFile;
- if(format==KEPRCPicture_PNG || format==KEPRCPicture_JPG)
- {
- data = new uint8_t[size];
- memcpy(data, p, size);
- uncompressed_files.push_back(uncompressed_file);
- uncompressed_files.back()->file_size = size;
- uncompressed_files.back()->data = data;
- picture.format = format;
- picture.uncompressed_file_index = static_cast<uint32_t>(uncompressed_files.size()-1);
- picture.pixel_width = 0; // width and height are ignored for JPG and PNG pictures - but let us keep things clean
- picture.pixel_height = 0;
- pictures.push_back(picture);
- return static_cast<uint32_t>(pictures.size()-1);
- }
-
- switch(format)
- {
- case KEPRCPicture_BITMAP_RGB_BYTE:
- components = 3; break;
- case KEPRCPicture_BITMAP_RGBA_BYTE:
- components = 4; break;
- case KEPRCPicture_BITMAP_GREY_BYTE:
- components = 1; break;
- case KEPRCPicture_BITMAP_GREYA_BYTE:
- components = 2; break;
- default:
- { cerr << "unknown picture format" << endl; return m1; }
- }
- if(width==0 || height==0)
- { cerr << "width or height parameter not set" << endl; return m1; }
- if (size < width*height*components)
- { cerr << "image too small" << endl; return m1; }
-
- {
- uint32_t compressedDataSize = 0;
- const int CHUNK= 1024; // is this reasonable?
-
- z_stream strm;
- strm.zalloc = Z_NULL;
- strm.zfree = Z_NULL;
- strm.opaque = Z_NULL;
- if(deflateInit(&strm,Z_DEFAULT_COMPRESSION) != Z_OK)
- { cerr << "Compression initialization failed" << endl; return m1; }
- unsigned int sizeAvailable = deflateBound(&strm,size);
- uint8_t *compressedData = (uint8_t*) malloc(sizeAvailable);
- strm.avail_in = size;
- strm.next_in = (unsigned char*)p;
- strm.next_out = (unsigned char*)compressedData;
- strm.avail_out = sizeAvailable;
-
- int code;
- unsigned int chunks = 0;
- while((code = deflate(&strm,Z_FINISH)) == Z_OK)
- {
- ++chunks;
- // strm.avail_out should be 0 if we got Z_OK
- compressedDataSize = sizeAvailable - strm.avail_out;
- compressedData = (uint8_t*) realloc(compressedData,CHUNK*chunks);
- strm.next_out = (Bytef*)(compressedData + compressedDataSize);
- strm.avail_out += CHUNK;
- sizeAvailable += CHUNK;
- }
- compressedDataSize = sizeAvailable-strm.avail_out;
-
- if(code != Z_STREAM_END)
- {
- deflateEnd(&strm);
- free(compressedData);
- { cerr << "Compression error" << endl; return m1; }
- }
-
- deflateEnd(&strm);
- size = compressedDataSize;
- data = new uint8_t[compressedDataSize];
- memcpy(data, compressedData, compressedDataSize);
- free(compressedData);
- }
- uncompressed_files.push_back(uncompressed_file);
- uncompressed_files.back()->file_size = size;
- uncompressed_files.back()->data = data;
- picture.format = format;
- picture.uncompressed_file_index = static_cast<uint32_t>(uncompressed_files.size()-1);
- picture.pixel_width = width;
- picture.pixel_height = height;
- pictures.push_back(picture);
- return static_cast<uint32_t>(pictures.size()-1);
-}
-
-uint32_t PRCFileStructure::addTextureDefinition(PRCTextureDefinition*& pTextureDefinition)
-{
- texture_definitions.push_back(pTextureDefinition);
- pTextureDefinition = NULL;
- return static_cast<uint32_t>(texture_definitions.size()-1);
-}
-
-uint32_t PRCFileStructure::addRgbColor(const PRCRgbColor &color)
-{
- colors.push_back(color);
- return 3*static_cast<uint32_t>(colors.size()-1);
-}
-
-uint32_t PRCFileStructure::addRgbColorUnique(const PRCRgbColor &color)
-{
- for(uint32_t i = 0; i < colors.size(); ++i)
- {
- if(colors[i] == color)
- return 3*i;
- }
- colors.push_back(color);
- return 3*static_cast<uint32_t>(colors.size()-1);
-}
-
-uint32_t oPRCFile::addColor(const PRCRgbColor &color)
-{
- PRCcolorMap::const_iterator pColor = colorMap.find(color);
- if(pColor!=colorMap.end())
- return pColor->second;
-// color_index = addRgbColorUnique(color);
- const uint32_t color_index = fileStructures[0]->addRgbColor(color);
- colorMap.insert(make_pair(color,color_index));
- return color_index;
-}
-
-uint32_t oPRCFile::addColour(const RGBAColour &colour)
-{
- PRCcolourMap::const_iterator pColour = colourMap.find(colour);
- if(pColour!=colourMap.end())
- return pColour->second;
- const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B));
- PRCStyle *style = new PRCStyle();
- style->line_width = 1.0;
- style->is_vpicture = false;
- style->line_pattern_vpicture_index = 0;
- style->is_material = false;
- style->color_material_index = color_index;
- style->is_transparency_defined = (colour.A < 1.0);
- style->transparency = (uint8_t)(colour.A * 256);
- style->additional = 0;
- const uint32_t style_index = fileStructures[0]->addStyle(style);
- colourMap.insert(make_pair(colour,style_index));
- return style_index;
-}
-
-uint32_t oPRCFile::addColourWidth(const RGBAColour &colour, double width)
-{
- RGBAColourWidth colourwidth(colour.R, colour.G, colour.B, colour.A, width);
- PRCcolourwidthMap::const_iterator pColour = colourwidthMap.find(colourwidth);
- if(pColour!=colourwidthMap.end())
- return pColour->second;
- const uint32_t color_index = addColor(PRCRgbColor(colour.R, colour.G, colour.B));
- PRCStyle *style = new PRCStyle();
- style->line_width = width;
- style->is_vpicture = false;
- style->line_pattern_vpicture_index = 0;
- style->is_material = false;
- style->color_material_index = color_index;
- style->is_transparency_defined = (colour.A < 1.0);
- style->transparency = (uint8_t)(colour.A * 256);
- style->additional = 0;
- const uint32_t style_index = fileStructures[0]->addStyle(style);
- colourwidthMap.insert(make_pair(colourwidth,style_index));
- return style_index;
-}
-
-uint32_t oPRCFile::addTransform(PRCGeneralTransformation3d*& transform)
-{
- if(!transform)
- return m1;
- PRCtransformMap::const_iterator pTransform = transformMap.find(*transform);
- if(pTransform!=transformMap.end())
- return pTransform->second;
- PRCCoordinateSystem *coordinateSystem = new PRCCoordinateSystem();
- bool transform_replaced = false;
- if( transform->M(0,1)==0 && transform->M(0,2)==0 &&
- transform->M(1,0)==0 && transform->M(1,2)==0 &&
- transform->M(2,0)==0 && transform->M(2,1)==0 &&
- transform->M(3,0)==0 && transform->M(3,1)==0 && transform->M(3,2)==0 && transform->M(3,3)==1 )
- {
- transform_replaced = true;
- PRCCartesianTransformation3d *carttransform = new PRCCartesianTransformation3d;
-// if(transform->M(0,3)==0 && transform->M(1,3)==0 && transform->M(1,3)==0 &&
-// transform->M(0,0)==1 && transform->M(1,1)==1 && transform->M(2,2)==1 )
-// carttransform->behaviour = PRC_TRANSFORMATION_Identity;
- if(transform->M(0,3)!=0 || transform->M(1,3)!=0 || transform->M(2,3)!=0)
- {
- carttransform->behaviour |= PRC_TRANSFORMATION_Translate;
- carttransform->origin.Set(transform->M(0,3),transform->M(1,3),transform->M(2,3));
- }
- if(transform->M(0,0)!=transform->M(1,1) || transform->M(0,0)!=transform->M(2,2))
- {
- carttransform->behaviour |= PRC_TRANSFORMATION_NonUniformScale;
- carttransform->scale.Set(transform->M(0,0),transform->M(1,1),transform->M(2,2));
- }
- else
- if(transform->M(0,0)!=1)
- {
- carttransform->behaviour |= PRC_TRANSFORMATION_Scale;
- carttransform->uniform_scale=transform->M(0,0);
- }
- coordinateSystem->axis_set = carttransform;
- }
- else
- coordinateSystem->axis_set = transform;
- const uint32_t coordinate_system_index = fileStructures[0]->addCoordinateSystem(coordinateSystem);
- transformMap.insert(make_pair(*transform,coordinate_system_index));
- if(transform_replaced)
- delete transform;
- transform = NULL;
- return coordinate_system_index;
-}
-
-uint32_t oPRCFile::addTransform(const double* t)
-{
- if(!t)
- return m1;
- PRCGeneralTransformation3d* transform = new PRCGeneralTransformation3d(t);
- return addTransform(transform);
-}
-
-uint32_t oPRCFile::addTransform(const double origin[3], const double x_axis[3], const double y_axis[3], double scale)
-{
- PRCCartesianTransformation3d* transform = new PRCCartesianTransformation3d(origin, x_axis, y_axis, scale);
- if(transform->behaviour==PRC_TRANSFORMATION_Identity)
- return m1;
- PRCCoordinateSystem *coordinateSystem = new PRCCoordinateSystem();
- coordinateSystem->axis_set = transform;
- const uint32_t coordinate_system_index = fileStructures[0]->addCoordinateSystem(coordinateSystem);
- return coordinate_system_index;
-}
-
-uint32_t oPRCFile::addMaterial(const PRCmaterial& m)
-{
- uint32_t material_index = m1;
- const PRCmaterialgeneric materialgeneric(m);
- PRCmaterialgenericMap::const_iterator pMaterialgeneric = materialgenericMap.find(materialgeneric);
- if(pMaterialgeneric!=materialgenericMap.end())
- material_index = pMaterialgeneric->second;
- else
-{
- PRCMaterialGeneric *materialGeneric = new PRCMaterialGeneric();
- const PRCRgbColor ambient(m.ambient.R, m.ambient.G, m.ambient.B);
- materialGeneric->ambient = addColor(ambient);
- const PRCRgbColor diffuse(m.diffuse.R, m.diffuse.G, m.diffuse.B);
- materialGeneric->diffuse = addColor(diffuse);
- const PRCRgbColor emissive(m.emissive.R, m.emissive.G, m.emissive.B);
-
- materialGeneric->emissive = addColor(emissive);
- const PRCRgbColor specular(m.specular.R, m.specular.G, m.specular.B);
- materialGeneric->specular = addColor(specular);
-
- materialGeneric->shininess = m.shininess;
- materialGeneric->ambient_alpha = m.ambient.A;
- materialGeneric->diffuse_alpha = m.diffuse.A;
- materialGeneric->emissive_alpha = m.emissive.A;
- materialGeneric->specular_alpha = m.specular.A;
- material_index = addMaterialGeneric(materialGeneric);
- materialgenericMap.insert(make_pair(materialgeneric,material_index));
- }
- uint32_t color_material_index = m1;
- if(m.picture_data!=NULL)
- {
- uint32_t picture_index = m1;
- PRCpicture picture(m);
- PRCpictureMap::const_iterator pPicture = pictureMap.find(picture);
- if(pPicture!=pictureMap.end())
- picture_index = pPicture->second;
- else
- {
- picture_index = addPicture(picture);
- uint8_t* data = new uint8_t[picture.size];
- memcpy(data,picture.data,picture.size);
- picture.data = data;
- pictureMap.insert(make_pair(picture,picture_index));
- }
-
- uint32_t texture_definition_index = m1;
- PRCtexturedefinition texturedefinition(picture_index, m);
- PRCtexturedefinitionMap::const_iterator pTexturedefinition = texturedefinitionMap.find(texturedefinition);
- if(pTexturedefinition!=texturedefinitionMap.end())
- texture_definition_index = pTexturedefinition->second;
- else
- {
- PRCTextureDefinition *TextureDefinition = new PRCTextureDefinition;
- if (m.picture_size==216688 && m.picture_format==KEPRCPicture_JPG)
- TextureDefinition->texture_mapping_attribute=PRC_TEXTURE_MAPPING_OPACITY;
- TextureDefinition->picture_index = picture_index;
- TextureDefinition->texture_function = m.picture_replace ? KEPRCTextureFunction_Replace : KEPRCTextureFunction_Modulate;
- TextureDefinition->texture_wrapping_mode_S = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge;
- TextureDefinition->texture_wrapping_mode_T = m.picture_repeat ? KEPRCTextureWrappingMode_Repeat : KEPRCTextureWrappingMode_ClampToEdge;
- TextureDefinition->texture_mapping_attribute_components = (m.picture_format==KEPRCPicture_BITMAP_RGB_BYTE || m.picture_format==KEPRCPicture_JPG) ? PRC_TEXTURE_MAPPING_COMPONENTS_RGB : PRC_TEXTURE_MAPPING_COMPONENTS_RGBA;
- texture_definition_index = addTextureDefinition(TextureDefinition);
- texturedefinitionMap.insert(make_pair(texturedefinition,texture_definition_index));
- }
-
- uint32_t texture_application_index = m1;
- const PRCtextureapplication textureapplication(material_index, texture_definition_index);
- PRCtextureapplicationMap::const_iterator pTextureapplication = textureapplicationMap.find(textureapplication);
- if(pTextureapplication!=textureapplicationMap.end())
- texture_application_index = pTextureapplication->second;
- else
- {
- PRCTextureApplication *TextureApplication = new PRCTextureApplication;
- TextureApplication->material_generic_index = material_index;
- TextureApplication->texture_definition_index = texture_definition_index;
- texture_application_index = addTextureApplication(TextureApplication);
- textureapplicationMap.insert(make_pair(textureapplication,texture_application_index));
- }
-
- color_material_index = texture_application_index;
- }
- else
- color_material_index = material_index;
-
- uint32_t style_index = m1;
- PRCstyle style(0,m.alpha,true,color_material_index);
- PRCstyleMap::const_iterator pStyle = styleMap.find(style);
- if(pStyle!=styleMap.end())
- style_index = pStyle->second;
- else
- {
- PRCStyle *Style = new PRCStyle();
- Style->line_width = 0.0;
- Style->is_vpicture = false;
- Style->line_pattern_vpicture_index = 0;
- Style->is_material = true;
- Style->is_transparency_defined = (m.alpha < 1.0);
- Style->transparency = (uint8_t)(m.alpha * 256);
- Style->additional = 0;
- Style->color_material_index = color_material_index;
- style_index = addStyle(Style);
- styleMap.insert(make_pair(style,style_index));
- }
-// materialMap.insert(make_pair(material,style_index));
- return style_index;
-}
-
-void oPRCFile::begingroup(const char *name, PRCoptions *options,
- const double* t)
-{
- const PRCgroup &parent_group = groups.top();
- groups.push(PRCgroup());
- PRCgroup &group = groups.top();
- group.name=name;
- if(options) group.options=*options;
- if(t&&!isid(t))
- group.transform = new PRCGeneralTransformation3d(t);
- group.product_occurrence = new PRCProductOccurrence(name);
- group.parent_product_occurrence = parent_group.product_occurrence;
- group.part_definition = new PRCPartDefinition;
- group.parent_part_definition = parent_group.part_definition;
-}
-
-void oPRCFile::endgroup()
-{
- if(groups.size()<2) {
- fputs("begingroup without matching endgroup",stderr);
- exit(1);
- }
- doGroup(groups.top());
- groups.pop();
-
-// std::cout << lastgroupname << std::endl;
-// for(std::vector<std::string>::const_iterator it=lastgroupnames.begin(); it!=lastgroupnames.end(); it++)
-// std::cout << " " << *it << std::endl;
-
-}
-
-PRCgroup& oPRCFile::findGroup()
-{
- return groups.top();
-}
-
-void oPRCFile::addPoints(uint32_t n, const double P[][3], const RGBAColour &c, double w)
-{
- if(n==0 || P==NULL)
- return;
- PRCgroup &group = findGroup();
- PRCPointSet *pointset = new PRCPointSet();
- group.pointsets.push_back(pointset);
- pointset->index_of_line_style = addColourWidth(c,w);
- pointset->point.reserve(n);
- for(uint32_t i=0; i<n; i++)
- pointset->point.push_back(PRCVector3d(P[i][0],P[i][1],P[i][2]));
-}
-
-void oPRCFile::useMesh(uint32_t tess_index, uint32_t style_index, const double origin[3], const double x_axis[3], const double y_axis[3], double scale)
-{
- PRCgroup &group = findGroup();
- PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel();
- polyBrepModel->index_local_coordinate_system = addTransform(origin, x_axis, y_axis, scale);
- polyBrepModel->index_tessellation = tess_index;
- polyBrepModel->is_closed = group.options.closed;
- polyBrepModel->index_of_line_style = style_index;
- group.polymodels.push_back(polyBrepModel);
-}
-
-void oPRCFile::useMesh(uint32_t tess_index, uint32_t style_index, const double* t)
-{
- PRCgroup &group = findGroup();
- PRCPolyBrepModel *polyBrepModel = new PRCPolyBrepModel();
- polyBrepModel->index_local_coordinate_system = addTransform(t);
- polyBrepModel->index_tessellation = tess_index;
- polyBrepModel->is_closed = group.options.closed;
- polyBrepModel->index_of_line_style = style_index;
- group.polymodels.push_back(polyBrepModel);
-}
-
-void oPRCFile::useLines(uint32_t tess_index, uint32_t style_index, const double origin[3], const double x_axis[3], const double y_axis[3], double scale)
-{
- PRCgroup &group = findGroup();
- PRCPolyWire *polyWire = new PRCPolyWire();
- polyWire->index_local_coordinate_system = addTransform(origin, x_axis, y_axis, scale);
- polyWire->index_tessellation = tess_index;
- polyWire->index_of_line_style = style_index;
- group.polywires.push_back(polyWire);
-}
-
-void oPRCFile::useLines(uint32_t tess_index, uint32_t style_index, const double* t)
-{
- PRCgroup &group = findGroup();
- PRCPolyWire *polyWire = new PRCPolyWire();
- polyWire->index_local_coordinate_system = addTransform(t);
- polyWire->index_tessellation = tess_index;
- polyWire->index_of_line_style = style_index;
- group.polywires.push_back(polyWire);
-}
-
-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],
- uint32_t nC, const RGBAColour C[], const uint32_t CI[][4],
- 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 = createQuadMesh(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::createQuadMesh(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[][4], uint32_t style_index,
- uint32_t nN, const double N[][3], const uint32_t NI[][4],
- uint32_t nT, const double T[][2], const uint32_t TI[][4],
- uint32_t nC, const RGBAColour C[], const uint32_t CI[][4],
- 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(2*(3*nI+(has_normals?3:0)*nI+(textured?3:0)*nI));
- for(uint32_t i=0; i<nI; i++)
- {
- // first triangle
- 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][3]);
- if(textured)
- tess->triangulated_index.push_back(2*TI[i][3]);
- tess->triangulated_index.push_back(3*PI[i][3]);
- // second triangle
- 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]);
- if(has_normals)
- tess->triangulated_index.push_back(3*NI[i][3]);
- if(textured)
- tess->triangulated_index.push_back(2*TI[i][3]);
- tess->triangulated_index.push_back(3*PI[i][3]);
- }
- tessFace->sizes_triangulated.push_back(2*nI);
- if(triangle_color)
- {
- tessFace->line_attributes.reserve(2*nI);
- for(uint32_t i=0; i<nI; i++)
- {
- tessFace->line_attributes.push_back(SI[i]);
- tessFace->line_attributes.push_back(SI[i]);
- }
- }
- else
- {
- 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(2*(tessFace->is_rgba?4:3)*3*nI);
- for(uint32_t i=0; i<nI; i++)
- {
- // first triangle
- 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][3]].R));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A));
- // second triangle
- 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));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].R));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].G));
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].B));
- if(tessFace->is_rgba)
- tessFace->rgba_vertices.push_back(byte(C[CI[i][3]].A));
- }
- }
- tess->addTessFace(tessFace);
- const uint32_t tess_index = add3DTess(tess);
- return tess_index;
-}
-
-/*
-void oPRCFile::addTriangle(const double P[][3], const double T[][2], uint32_t style_index)
-{
- PRCgroup &group = findGroup();
-
- group.triangles.push_back(PRCtesstriangle());
- PRCtesstriangle &triangle = group.triangles.back();
- for(size_t i = 0; i < 3; i++)
- {
- triangle.vertices[i].x = P[i][0];
- triangle.vertices[i].y = P[i][1];
- triangle.vertices[i].z = P[i][2];
- triangle.texcoords[i].x = T[i][0];
- triangle.texcoords[i].y = T[i][1];
- }
- triangle.style = style_index;
-}
-*/
-
-void oPRCFile::addLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[],
- const RGBAColour& c, double w,
- bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[])
-{
- if(nP==0 || P==NULL || nI==0 || PI==NULL)
- return;
- const uint32_t tess_index = createLines(nP, P, nI, PI, segment_color, nC, C, nCI, CI);
- useLines(tess_index, c, w);
-}
-
-uint32_t oPRCFile::createLines(uint32_t nP, const double P[][3], uint32_t nI, const uint32_t PI[],
- bool segment_color, uint32_t nC, const RGBAColour C[], uint32_t nCI, const uint32_t CI[])
-{
- if(nP==0 || P==NULL || nI==0 || PI==NULL)
- return m1;
-
- const bool vertex_color = (nC != 0 && C != NULL && CI != NULL);
-
- PRC3DWireTess *tess = new PRC3DWireTess();
- 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]);
- }
- tess->wire_indexes.reserve(nI);
- for(uint32_t i=0; i<nI;)
- {
- tess->wire_indexes.push_back(PI[i]);
- const uint32_t ni = i+PI[i]+1;
- for(i++; i<ni; i++)
- tess->wire_indexes.push_back(3*PI[i]);
- }
- if(vertex_color)
- {
- tess->is_segment_color = segment_color;
- tess->is_rgba=false;
- for(uint32_t i=0; i<nCI; i++)
- if(1.0 != C[CI[i]].A)
- {
- tess->is_rgba=true;
- break;
- }
- tess->rgba_vertices.reserve((tess->is_rgba?4:3)*nCI);
- for(uint32_t i=0; i<nCI; i++)
- {
- tess->rgba_vertices.push_back(byte(C[CI[i]].R));
- tess->rgba_vertices.push_back(byte(C[CI[i]].G));
- tess->rgba_vertices.push_back(byte(C[CI[i]].B));
- if(tess->is_rgba)
- tess->rgba_vertices.push_back(byte(C[CI[i]].A));
- }
- }
- const uint32_t tess_index = add3DWireTess(tess);
- return tess_index;
-}
-
-#define PRCFACETRANSFORM const double origin[3], const double x_axis[3], const double y_axis[3], double scale, const double* t
-
-void oPRCFile::addHemisphere(double radius, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCSphere)
- SETTRANSF
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y = 0;
- surface->uv_domain.max.y = 0.5*pi;
- surface->radius = radius;
-}
-
-void oPRCFile::addSphere(double radius, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCSphere)
- SETTRANSF
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y =-0.5*pi;
- surface->uv_domain.max.y = 0.5*pi;
- surface->radius = radius;
-}
-
-void oPRCFile::addDisk(double radius, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCRuled)
- SETTRANSF
- PRCCircle *first_curve = new PRCCircle;
- first_curve->radius = radius;
- surface->first_curve = first_curve;
- PRCCircle *second_curve = new PRCCircle;
- second_curve->radius = 0;
- surface->second_curve = second_curve;
-
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 1;
- surface->uv_domain.min.y = 0;
- surface->uv_domain.max.y = 2*pi;
- surface->parameterization_on_v_coeff_a = -1;
- surface->parameterization_on_v_coeff_b = 2*pi;
-}
-
-void oPRCFile::addCylinder(double radius, double height, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCCylinder)
- SETTRANSF
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y = (height>0)?0:height;
- surface->uv_domain.max.y = (height>0)?height:0;
- surface->radius = radius;
-}
-
-void oPRCFile::addCone(double radius, double height, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCCone)
- SETTRANSF
- surface->uv_domain.min.x = 0;
- surface->uv_domain.max.x = 2*pi;
- surface->uv_domain.min.y = (height>0)?0:height;
- surface->uv_domain.max.y = (height>0)?height:0;
- surface->bottom_radius = radius;
- surface->semi_angle = -atan(radius/height);;
-}
-
-void oPRCFile::addTorus(double major_radius, double minor_radius, double angle1, double angle2, const PRCmaterial &m, PRCFACETRANSFORM)
-{
- ADDFACE(PRCTorus)
- SETTRANSF
- surface->uv_domain.min.x = (angle1/180)*pi;
- surface->uv_domain.max.x = (angle2/180)*pi;
- surface->uv_domain.min.y = 0;
- surface->uv_domain.max.y = 2*pi;
- surface->major_radius = major_radius;
- surface->minor_radius = minor_radius;
-}
-
-#undef ADDWIRE
-#undef SETTRANSF
-
-uint32_t PRCFileStructure::addMaterialGeneric(PRCMaterialGeneric*& pMaterialGeneric)
-{
- materials.push_back(pMaterialGeneric);
- pMaterialGeneric = NULL;
- return static_cast<uint32_t>(materials.size()-1);
-}
-
-uint32_t PRCFileStructure::addTextureApplication(PRCTextureApplication*& pTextureApplication)
-{
- materials.push_back(pTextureApplication);
- pTextureApplication = NULL;
- return static_cast<uint32_t>(materials.size()-1);
-}
-
-uint32_t PRCFileStructure::addStyle(PRCStyle*& pStyle)
-{
- styles.push_back(pStyle);
- pStyle = NULL;
- return static_cast<uint32_t>(styles.size()-1);
-}
-
-uint32_t PRCFileStructure::addPartDefinition(PRCPartDefinition*& pPartDefinition)
-{
- part_definitions.push_back(pPartDefinition);
- pPartDefinition = NULL;
- return static_cast<uint32_t>(part_definitions.size()-1);
-}
-
-uint32_t PRCFileStructure::addProductOccurrence(PRCProductOccurrence*& pProductOccurrence)
-{
- product_occurrences.push_back(pProductOccurrence);
- pProductOccurrence = NULL;
- return static_cast<uint32_t>(product_occurrences.size()-1);
-}
-
-uint32_t PRCFileStructure::addTopoContext(PRCTopoContext*& pTopoContext)
-{
- contexts.push_back(pTopoContext);
- pTopoContext = NULL;
- return static_cast<uint32_t>(contexts.size()-1);
-}
-
-uint32_t PRCFileStructure::getTopoContext(PRCTopoContext*& pTopoContext)
-{
- pTopoContext = new PRCTopoContext;
- contexts.push_back(pTopoContext);
- return static_cast<uint32_t>(contexts.size()-1);
-}
-
-uint32_t PRCFileStructure::add3DTess(PRC3DTess*& p3DTess)
-{
- tessellations.push_back(p3DTess);
- p3DTess = NULL;
- return static_cast<uint32_t>(tessellations.size()-1);
-}
-
-uint32_t PRCFileStructure::add3DWireTess(PRC3DWireTess*& p3DWireTess)
-{
- tessellations.push_back(p3DWireTess);
- p3DWireTess = NULL;
- return static_cast<uint32_t>(tessellations.size()-1);
-}
-/*
-uint32_t PRCFileStructure::addMarkupTess(PRCMarkupTess*& pMarkupTess)
-{
- tessellations.push_back(pMarkupTess);
- pMarkupTess = NULL;
- return tessellations.size()-1;
-}
-
-uint32_t PRCFileStructure::addMarkup(PRCMarkup*& pMarkup)
-{
- markups.push_back(pMarkup);
- pMarkup = NULL;
- return markups.size()-1;
-}
-
-uint32_t PRCFileStructure::addAnnotationItem(PRCAnnotationItem*& pAnnotationItem)
-{
- annotation_entities.push_back(pAnnotationItem);
- pAnnotationItem = NULL;
- return annotation_entities.size()-1;
-}
-*/
-uint32_t PRCFileStructure::addCoordinateSystem(PRCCoordinateSystem*& pCoordinateSystem)
-{
- reference_coordinate_systems.push_back(pCoordinateSystem);
- pCoordinateSystem = NULL;
- return static_cast<uint32_t>(reference_coordinate_systems.size()-1);
-}
-
-uint32_t PRCFileStructure::addCoordinateSystemUnique(PRCCoordinateSystem*& pCoordinateSystem)
-{
- for(uint32_t i = 0; i < reference_coordinate_systems.size(); ++i)
- {
- if(*(reference_coordinate_systems[i])==*pCoordinateSystem) {
- pCoordinateSystem = NULL;
- return i;
- }
- }
- reference_coordinate_systems.push_back(pCoordinateSystem);
- pCoordinateSystem = NULL;
- return static_cast<uint32_t>(reference_coordinate_systems.size()-1);
-}
-
-}