3D PDF: PRC specification continuation, Right Hemisphere Adobe Mesh

This commit is contained in:
Jakub Melka
2023-01-28 17:24:31 +01:00
parent a8727c8dc4
commit 70283ba7af
4 changed files with 672 additions and 5 deletions

View File

@@ -43,7 +43,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(GNUInstallDirs)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg Xml PrintSupport TextToSpeech OpenGL OpenGLWidgets Multimedia Network Test 3dcore 3drender 3dinput 3dlogic 3dextras)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Svg Xml PrintSupport TextToSpeech OpenGL OpenGLWidgets Multimedia Network Test 3dcore 3drender 3dinput 3dlogic 3dextras ShaderTools)
qt_standard_project_setup()
find_package(OpenSSL REQUIRED)

View File

@@ -16,6 +16,7 @@
// along with PDF4QT. If not, see <https://www.gnu.org/licenses/>.
#include "pdf3d_u3d.h"
#include "pdfstreamfilters.h"
#include <QImageReader>
#include <QStringConverter>
@@ -915,6 +916,16 @@ private:
float m_reserved3 = 0.0;
};
class PDF3D_U3D_RHAdobeMeshResourceBlock : public PDF3D_U3D_AbstractBlock
{
public:
virtual EBlockType getBlockType() const override { return PDF3D_U3D_Block_Info::BT_Unknown; }
static PDF3D_U3D_AbstractBlockPtr parse(QByteArray data, QByteArray metaData, PDF3D_U3D_Parser* object);
private:
};
class PDF3D_U3D_LineSetContinuationBlock : public PDF3D_U3D_AbstractBlock
{
public:
@@ -1509,6 +1520,8 @@ public:
void addBlockToU3D(PDF3D_U3D_AbstractBlockPtr block);
PDF3D_U3D_Block_Info::EPalette getPaletteByBlockType(uint32_t blockType) const;
QStringList getErrors() const { return m_errors; }
private:
@@ -1532,6 +1545,7 @@ private:
bool m_isCompressed = true;
uint32_t m_priority = 0;
QStringDecoder m_stringDecoder;
uint32_t m_RHAdobeMeshResourceId = 0;
};
class PDF3D_U3D_DataReader
@@ -1547,6 +1561,7 @@ public:
uint8_t readU8();
uint16_t readU16();
uint32_t readU24();
uint32_t readU32();
uint64_t readU64();
int16_t readI16();
@@ -1672,6 +1687,14 @@ uint16_t PDF3D_U3D_DataReader::readU16()
return low + (high << 8);
}
uint32_t PDF3D_U3D_DataReader::readU24()
{
const uint32_t low = readU8();
const uint32_t high = readU8();
const uint32_t highest = readU8();
return low + (high << 8) + (highest << 16);
}
uint32_t PDF3D_U3D_DataReader::readU32()
{
const uint32_t low = readU16();
@@ -3416,6 +3439,16 @@ void PDF3D_U3D_Parser::addBlockToU3D(PDF3D_U3D_AbstractBlockPtr block)
}
}
PDF3D_U3D_Block_Info::EPalette PDF3D_U3D_Parser::getPaletteByBlockType(uint32_t blockType) const
{
if (blockType == m_RHAdobeMeshResourceId)
{
return PDF3D_U3D_Block_Info::PL_Generator;
}
return PDF3D_U3D_Block_Info::getPalette(static_cast<PDF3D_U3D_Block_Info::EBlockType>(blockType));
}
PDF3D_U3D_Parser::PDF3D_U3D_Parser()
{
// Jakub Melka: Utf-8 (MIB 106) is default value for U3D strings
@@ -3503,6 +3536,19 @@ void PDF3D_U3D_Parser::processBlock(const PDF3D_U3D_Block_Data& blockData,
}
case PDF3D_U3D_NewObjectTypeBlock::ID:
{
auto block = parseBlock(blockData);
const PDF3D_U3D_NewObjectTypeBlock* newObjectTypeBlock = dynamic_cast<const PDF3D_U3D_NewObjectTypeBlock*>(block.get());
// Right Hemisphere Adobe Mesh (RHAdobeMeshResource)
// {00000000-0000-0000-0000-000000000000}
if (newObjectTypeBlock->getExtensionId() == QUuid::fromString("{96a804a6-3fb9-43c5-b2df-2a31b5569340}"))
{
m_RHAdobeMeshResourceId = newObjectTypeBlock->getNewDeclarationBlockType();
}
break;
}
case PDF3D_U3D_FileReferenceBlock::ID:
// Skip this block, we do not handle these type of blocks,
// just read it... to check errors.
@@ -3558,7 +3604,7 @@ void PDF3D_U3D_Parser::processGenericBlock(const PDF3D_U3D_Block_Data& blockData
uint32_t chainIndex = 0;
PDF3D_U3D_Block_Info::EPalette effectivePalette = PDF3D_U3D_Block_Info::isChain(blockData.blockType) ? palette
: PDF3D_U3D_Block_Info::getPalette(blockData.blockType);
: getPaletteByBlockType(blockData.blockType);
if (effectivePalette == PDF3D_U3D_Block_Info::PL_LastPalette)
{
@@ -3700,6 +3746,11 @@ PDF3D_U3D_AbstractBlockPtr PDF3D_U3D_Parser::parseBlock(uint32_t blockType,
return PDF3D_U3D_MotionResourceBlock::parse(data, metaData, this);
default:
if (blockType == m_RHAdobeMeshResourceId)
{
return PDF3D_U3D_RHAdobeMeshResourceBlock::parse(data, metaData, this);
}
m_errors << PDFTranslationContext::tr("Unable to parse block of type '%1'.").arg(blockType, 8, 16);
break;
}
@@ -6766,6 +6817,154 @@ void PDF3D_U3D_Geometry::setShaders(const std::vector<QStringList>& newShaders)
m_shaders = newShaders;
}
PDF3D_U3D_AbstractBlockPtr PDF3D_U3D_RHAdobeMeshResourceBlock::parse(QByteArray data, QByteArray metaData, PDF3D_U3D_Parser* object)
{
PDF3D_U3D_RHAdobeMeshResourceBlock* block = new PDF3D_U3D_RHAdobeMeshResourceBlock();
PDF3D_U3D_AbstractBlockPtr pointer(block);
PDF3D_U3D_DataReader reader(data, object->isCompressed());
QString objectName = reader.readString(object->getStringDecoder());
uint32_t chainIndex = reader.readU32();
/*
QByteArray remainingData = reader.readRemainingData();
QByteArray uncompressedData = PDFFlateDecodeFilter::uncompress(remainingData);
return pointer;
*/
// Read the data
while (!reader.isAtEnd())
{
// Read the header
QString encoding = reader.readString(object->getStringDecoder());
uint8_t flags = reader.readU8();
const bool hasExtensionData = flags & 0x10;
const bool hasSkeletonData = flags & 0x20;
const uint8_t materialTypeCount = flags >> 6;
if (hasExtensionData)
{
uint32_t sizeOfTheMeshDescriptionBlock = reader.readU32();
uint16_t numberOfSubChunks = reader.readU16();
Q_UNUSED(sizeOfTheMeshDescriptionBlock);
for (uint16_t i = 0; i < numberOfSubChunks; ++i)
{
uint32_t subChunkSize = reader.readU32();
uint16_t subChunkTypeInfo = reader.readU16();
Q_UNUSED(subChunkSize);
Q_UNUSED(subChunkTypeInfo);
}
}
uint32_t materialCount = 0;
switch (materialTypeCount)
{
case 0x00:
materialCount = 1;
break;
case 0x01:
materialCount = reader.readU8();
break;
case 0x02:
materialCount = reader.readU16();
break;
case 0x03:
materialCount = reader.readU32();
break;
}
struct MaterialInfo
{
uint8_t textureDimensions = 0;
uint32_t numberOfTextureLayers = 0;
uint32_t originalShadingId = 0;
bool hasDiffuseColors = false;
bool hasSpecularColors = false;
QByteArray additionalTextDimensions;
};
std::vector<MaterialInfo> materialInfos;
// We will read material info from the data
if (materialTypeCount != 0)
{
for (uint32_t i = 0; i < materialTypeCount; ++i)
{
MaterialInfo materialInfo;
uint8_t materialFlags = reader.readU8();
materialInfo.textureDimensions = materialFlags & 0x03;
uint8_t originalShadingIdBytes = (materialFlags >> 2) & 0x03;
uint8_t numberOfTextureLayersBytes = (materialFlags >> 4) & 0x03;
materialInfo.hasDiffuseColors = (materialFlags & 0x40);
materialInfo.hasSpecularColors = (materialFlags & 0x80);
switch (numberOfTextureLayersBytes)
{
case 0:
materialInfo.numberOfTextureLayers = reader.readU8();
break;
case 1:
materialInfo.numberOfTextureLayers = reader.readU16();
break;
case 2:
materialInfo.numberOfTextureLayers = reader.readU24();
break;
case 3:
materialInfo.numberOfTextureLayers = reader.readU32();
break;
}
switch (originalShadingIdBytes)
{
case 0:
materialInfo.originalShadingId = reader.readU8();
break;
case 1:
materialInfo.originalShadingId = reader.readU16();
break;
case 2:
materialInfo.originalShadingId = reader.readU24();
break;
case 3:
materialInfo.originalShadingId = reader.readU32();
break;
}
uint32_t numberOfAdditionalTextureLayers = materialInfo.numberOfTextureLayers > 0 ? materialInfo.numberOfTextureLayers - 1 : 0;
uint32_t numberOfAdditionalTextureLayersBytes = 0;
if (numberOfAdditionalTextureLayers % 4 > 0)
{
numberOfAdditionalTextureLayersBytes = numberOfAdditionalTextureLayers / 4 + 1;
}
else
{
numberOfAdditionalTextureLayersBytes = numberOfAdditionalTextureLayers / 4;
}
if (numberOfAdditionalTextureLayersBytes > 0)
{
materialInfo.additionalTextDimensions = reader.readByteArray(numberOfAdditionalTextureLayersBytes);
}
materialInfos.emplace_back(std::move(materialInfo));
}
}
break;
}
block->parseMetadata(metaData, object);
return pointer;
}
} // namespace u3d
} // namespace pdf

View File

@@ -61,7 +61,7 @@ GENERATE_EXPORT_HEADER(Pdf4QtViewer
PDF4QTVIEWERLIBSHARED_EXPORT
EXPORT_FILE_NAME "${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR}/pdf4qtviewer_export.h")
target_link_libraries(Pdf4QtViewer PRIVATE Pdf4QtLib Qt6::Core Qt6::Gui Qt6::Widgets Qt6::PrintSupport Qt6::TextToSpeech Qt6::Xml Qt6::OpenGLWidgets Qt6::3DCore Qt6::3DRender Qt6::3DInput Qt6::3DLogic Qt6::3DExtras)
target_link_libraries(Pdf4QtViewer PRIVATE Pdf4QtLib Qt6::Core Qt6::Gui Qt6::Widgets Qt6::PrintSupport Qt6::TextToSpeech Qt6::Xml Qt6::OpenGLWidgets Qt6::3DCore Qt6::3DRender Qt6::3DInput Qt6::3DLogic Qt6::3DExtras Qt6::ShaderTools)
target_include_directories(Pdf4QtViewer INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(Pdf4QtViewer PUBLIC ${CMAKE_BINARY_DIR}/${INSTALL_INCLUDEDIR})

View File

@@ -9,6 +9,45 @@
<enums>
<enum name="EntityType">
<item name="PRC_TYPE_CRV" value="PRC_TYPE_ROOT + 10" />
<item name="PRC_TYPE_CRV_Base" value="PRC_TYPE_CRV + 1" />
<item name="PRC_TYPE_CRV_Blend02Boundary" value="PRC_TYPE_CRV + 2" />
<item name="PRC_TYPE_CRV_NURBS" value="PRC_TYPE_CRV + 3" />
<item name="PRC_TYPE_CRV_Circle" value="PRC_TYPE_CRV + 4" />
<item name="PRC_TYPE_CRV_Composite" value="PRC_TYPE_CRV + 5" />
<item name="PRC_TYPE_CRV_OnSurf" value="PRC_TYPE_CRV + 6" />
<item name="PRC_TYPE_CRV_Ellipse" value="PRC_TYPE_CRV + 7" />
<item name="PRC_TYPE_CRV_Equation" value="PRC_TYPE_CRV + 8" />
<item name="PRC_TYPE_CRV_Helix01" value="PRC_TYPE_CRV + 9" />
<item name="PRC_TYPE_CRV_Hyperbola" value="PRC_TYPE_CRV + 10" />
<item name="PRC_TYPE_CRV_Intersection" value="PRC_TYPE_CRV + 11" />
<item name="PRC_TYPE_CRV_Line" value="PRC_TYPE_CRV + 12" />
<item name="PRC_TYPE_CRV_Offset" value="PRC_TYPE_CRV + 13" />
<item name="PRC_TYPE_CRV_Parabola" value="PRC_TYPE_CRV + 14" />
<item name="PRC_TYPE_CRV_PolyLine" value="PRC_TYPE_CRV + 15" />
<item name="PRC_TYPE_CRV_Transform" value="PRC_TYPE_CRV + 16" />
<item name="PRC_TYPE_SURF" value="PRC_TYPE_ROOT + 75" />
<item name="PRC_TYPE_SURF_Base" value="PRC_TYPE_SURF + 1" />
<item name="PRC_TYPE_SURF_Blend01" value="PRC_TYPE_SURF + 2" />
<item name="PRC_TYPE_SURF_Blend02" value="PRC_TYPE_SURF + 3" />
<item name="PRC_TYPE_SURF_Blend03" value="PRC_TYPE_SURF + 4" />
<item name="PRC_TYPE_SURF_NURBS" value="PRC_TYPE_SURF + 5" />
<item name="PRC_TYPE_SURF_Cone" value="PRC_TYPE_SURF + 6" />
<item name="PRC_TYPE_SURF_Cylinder" value="PRC_TYPE_SURF + 7" />
<item name="PRC_TYPE_SURF_Cyldrical" value="PRC_TYPE_SURF + 8" />
<item name="PRC_TYPE_SURF_Offset" value="PRC_TYPE_SURF + 9" />
<item name="PRC_TYPE_SURF_Pipe" value="PRC_TYPE_SURF + 10" />
<item name="PRC_TYPE_SURF_Plane" value="PRC_TYPE_SURF + 11" />
<item name="PRC_TYPE_SURF_Ruled" value="PRC_TYPE_SURF + 12" />
<item name="PRC_TYPE_SURF_Sphere" value="PRC_TYPE_SURF + 13" />
<item name="PRC_TYPE_SURF_Revolution" value="PRC_TYPE_SURF +14" />
<item name="PRC_TYPE_SURF_Extrusion" value="PRC_TYPE_SURF + 15" />
<item name="PRC_TYPE_SURF_FromCurves" value="PRC_TYPE_SURF + 16" />
<item name="PRC_TYPE_SURF_Torus" value="PRC_TYPE_SURF + 17" />
<item name="PRC_TYPE_SURF_Transform" value="PRC_TYPE_SURF + 18" />
<item name="PRC_TYPE_SURF_Blend04" value="PRC_TYPE_SURF + 19" />
<item name="PRC_TYPE_TOPO" value="PRC_TYPE_ROOT + 140" />
<item name="PRC_TYPE_TOPO_Context" value="PRC_TYPE_TOPO + 1" />
<item name="PRC_TYPE_TOPO_Item" value="PRC_TYPE_TOPO + 2" />
@@ -607,7 +646,7 @@
<object name="ElementInformation">
<field name="has_graphics" type="Boolean" />
<field name="graphic_behavior" typ="ElementGraphicsBehavior" condition="has_graphics == TRUE" />
<field name="graphic_behavior" type="ElementGraphicsBehavior" condition="has_graphics == TRUE" />
</object>
<object name="ElementGraphicsBehavior">
@@ -1667,7 +1706,436 @@
<field name="knot2" type="DoubleWithVariableBitNumber" condition="number_bit_parameter &lt;= 30" />
</object>
str. 146
<object name="CompressedWeights">
<field name="number_bit_weight" type="UnsignedIntegerWithVariableBitNumber" bits="6" />
<array name="weights" dim="number_ccpt_in_u * number_ccpt_in_v" type="Double" condition="number_bit_weight > 30" />
<field name="tolerance" type="Double" condition="number_bit_weight &lt;= 30" />
<array name="compressed_weights" dim="number_ccpt_in_u * number_ccpt_in_v" type="DoubleWithVariableBitNumber" condition="number_bit_weight &lt;= 30" />
</object>
<object name="ContentCompressedFace">
<field name="orientation_surface_with_shell" type="Boolean" />
<field name="iso_face" type="ContentCompressedIsoFace" condition="is_an_iso_face == TRUE"/>
<field name="ana_face" type="ContentCompressedAnaFace" condition="is_an_iso_face == FALSE" />
</object>
<object name="ContentCompressedIsoFace">
<field name="orientation_loop_with_surface" type="Boolean" />
<field name="first_trim_curve" type="RefOrCompressedCurve" />
<field name="second_trim_curve" type="RefOrCompressedCurve" />+
<field name="third_trim_curve_is_not_yet_saved" type="Boolean" />
<field name="third_trim_curve" type="UnsignedIntegerWithVariableBitNumber" condition="third_trim_curve_is_not_yet_saved == FALSE" />
<field name="fourth_trim_curve_is_not_yet_saved" type="Boolean" />
<field name="fourth_trim_curve" type="UnsignedIntegerWithVariableBitNumber" condition="fourth_trim_curve_is_not_yet_saved == FALSE" />
<field name="common_third_fourth_vertex" type="CompressedVertex" condition="third_trim_curve_is_not_yet_saved &amp;&amp; fourth_trim_curve_is_not_yet_saved" />
</object>
<object name="ContentCompressedAnaFace">
<field name="is_trimmed" type="Boolean" />
<array name="trim_loop" dim="" type="AnaFaceTrimLoop" condition="is_trimmed == TRUE" />
<field name="point_on_torus" type="CompressedPoint" condition="all_loops_are_vertex_loops == TRUE &amp;&amp; surface_type == PRC_HCG_AnaTorus &amp;&amp; is_trimmed == TRUE" />
</object>
<object name="AnaFaceTrimLoop">
<field name="loop_surface_orientation" type="Boolean" />
<array name="curves" dim="" type="RefOrCompressedCurve" />
<field name="curve_is_not_already_stored" type="Boolean" />
<field name="type" type="CompressedEntityType" />
</object>
<object name="RefOrCompressedCurve">
<field name="curve_is_not_already_stored" type="Boolean" />
<field name="index_compressed_curve" type="UnsignedIntegerWithVariableBitNumber" bits="number_of_bits_to_store_reference" condition="curve_is_not_already_stored == FALSE" />
<field name="compressed_curve" type="CompressedCurve" condition="curve_is_not_already_stored == TRUE" />
</object>
<object name="PRC_HCG_Line">
<field name="" type="CompressedEntityType" constant="PRC_HCG_Line" />
<field name="start_end_data" type="StartEndData" />
</object>
<object name="PRC_HCG_Circle">
<field name="" type="CompressedEntityType" constant="PRC_HCG_Circle" condition="compressed_iso_spline == FALSE" />
<field name="is_particular_circle" type="Boolean" />
<field name="particular_circle" type="ParticularCircle" condition="is_particular_circle == TRUE" />
<field name="general_circle" type="GeneralCircle" condition="is_particular_circle == FALSE" />
</object>
<object name="ParticularCircle">
<field name="full_circle" type="Boolean" />
<field name="start_end_data" type="StartEndData" condition="compressed_iso_spline == FALSE" />
<field name="center" type="CompressedPoint" condition="full_circle == TRUE" />
<field name="normal_plane" type="CompressedPoint" condition="full_circle == TRUE" />
<field name="middle_of_arc" type="CompressedPoint" condition="full_circle == FALSE" />
</object>
<object name="GeneralCircle">
<field name="start_end_data" type="StartEndData" />
<field name="center" type="CompressedPoint" />
<field name="circle_angle" type="Boolean" />
</object>
<object name="PRC_HCG_BsplineHermiteCurve">
<field name="" type="CompressedEntityType" constant="PRC_HCG_BsplineHermiteCurve" />
<field name="start_end_data" type="StartEndData" />
<field name="number_bits" type="UnsignedIntegerWithVariableBitNumber" bits="4" />
<field name="number_points" type="UnsignedIntegerWithVariableBitNumber" bits="number_bits" />
<field name="point_number_bits" type="UnsignedIntegerWithVariableBitNumber" bits="6" />
<array name="points" dim="number_points - 2" type="Vector3d" condition="point_number_bits &gt; 30" />
<array name="compressed_points" dim="number_points - 2" type="Point3DWithVariableBitNumber" bits="point_number_bits" condition="point_number_bits &lt;= 30" />
<field name="tangent_number_bits" type="UnsignedIntegerWithVariableBitNumber" bits="6" />
<array name="tangents" dim="number_points" type="Vector3d" condition="tangent_number_bits &gt; 30" />
<array name="compressed_tangents" dim="number_points" type="Point3DWithVariableBitNumber" bits="tangent_number_bits" condition="tangent_number_bits &lt;= 30" />
</object>
<object name="PRC_HCG_CompositeCurve">
<field name="" type="CompressedEntityType" constant="PRC_HCG_CompositeCurve" condition="compressed_iso_spline == FALSE" />
<field name="start_end_data" type="StartEndData" />
<field name="dimension" type="UnsignedInteger" />
<field name="is_closed" type="Boolean" />
<field name="number_of_curves" type="UnsignedInteger" />
<array name="curves" dim="number_of_curves" type="CompressedCurve" />
</object>
<object name="StartEndData">
<field name="start_vertex" type="CompressedVertex" condition="curve_trimming_face == TRUE" />
<field name="end_vertex" type="CompressedVertex" condition="curve_trimming_face == TRUE" />
<field name="start_point" type="CompressedPoint" condition="curve_trimming_face == FALSE" />
<field name="end_point" type="CompressedPoint" condition="curve_trimming_face == FALSE" />
</object>
<object name="CompressedVertex">
<field name="already_stored" type="Boolean" />
<field name="point_index" type="UnsignedIntegerWithVariableBitNumber" bits="number_of_bits_to_store_reference" condition="already_stored == FALSE" />
<field name="point_data" type="CompressedPoint" condition="already_stored == TRUE" />
</object>
<object name="CompressedPoint">
<field name="uNbBits" type="UnsignedIntegerWithVariableBitNumber" bits="6" />
<field name="pointA" type="Point3DWithVariableBitNumber" condition="uNbBits &lt;= 30" />
<field name="pointB" type="Vector3d" condition="uNbBits &gt; 30" />
</object>
<object name="PtrCurve">
<field name="is_referenced" type="Boolean" />
<field name="curve" type="PRC_TYPE_CRV" condition="is_referenced == FALSE" />
<field name="curve_identifier" type="UnsignedInteger" condition="is_referenced == TRUE" />
</object>
<object name="PtrSurface">
<field name="is_referenced" type="Boolean" />
<field name="surface" type="PRC_TYPE_SURF" condition="is_referenced == FALSE" />
<field name="surface_identifier" type="UnsignedInteger" condition="is_referenced == TRUE" />
</object>
<object name="PtrTopology">
<field name="is_referenced" type="Boolean" />
<field name="topo" type="PRC_TYPE_TOPO" condition="is_referenced == FALSE" />
<field name="topo_identifier" type="UnsignedInteger" condition="is_referenced == TRUE" />
</object>
<object name="ContentCurve">
<field name="has_base_geometry" type="Boolean" />
<field name="attribute_data" type="AttributeData" condition="has_base_geometry == TRUE" />
<field name="name" type="Name" condition="has_base_geometry == TRUE" />
<field name="id" type="UnsignedInteger" condition="has_base_geometry == TRUE" />
<field name="extend_type" type="UnsignedInteger" />
<field name="is_3d_flag" type="Boolean" />
</object>
<object name="PRC_TYPE_CRV_Blend02Boundary">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Blend02Boundary" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="surface" type="PtrSurface" />
<field name="bound" type="Integer" />
<field name="number_of_crossing_points" type="UnsignedInteger" />
<array name="crossing_points" dim="number_of_crossing_points" type="Vector3d" />
<field name="chord_error" type="Double" />
<field name="angle_error" type="Double" />
<field name="bound_surface" type="PtrSurface" />
<field name="sense_bound_surface" type="Boolean" />
<field name="intersection_order" type="Boolean" />
<field name="sense_intersection_order" type="Boolean" />
<field name="base_parameter" type="Double" />
<field name="base_scale" type="Double" />
<field name="start_limit_point" type="Vector3D" />
<field name="start_limit_type" type="UnsignedInteger" />
<field name="end_limit_point" type="Vector3D" />
<field name="end_limit_type" type="UnsignedInteger" />
</object>
<object name="PRC_TYPE_CRV_NURBS">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_NURBS" />
<field name="curve_data" type="ContentCurve" />
<field name="is_rational" type="Boolean" />
<field name="d" type="UnsignedInteger" />
<field name="highest_index_of_control_points" type="UnsignedInteger" />
<field name="highest_index_of_knots" type="UnsignedInteger" />
<array name="p" dim="np" type="ControlPointsNurbsCrv" />
<array name="u" dim="nu" type="Double" />
<field name="knot_type" type="UnsignedInteger" />
<field name="curve_form" type="UnsignedInteger" />
</object>
<object name="ControlPointsNurbsCrv">
<field name="x" type="Double" />
<field name="y" type="Double" />
<field name="z" type="Double" condition="is_3d_flag == TRUE" />
<field name="w" type="Double" condition="is_rational == TRUE" />
</object>
<object name="PRC_TYPE_CRV_Circle">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Circle" />
<field name="curve_data" type="ContentCurve" />
<field name="has_transform" type="Boolean" />
<field name="transform" type="Transformation" condition="has_transform == TRUE" />
<field name="paramaterization" type="Parameterization" />
<field name="radius" type="Double" />
</object>
<object name="PRC_TYPE_CRV_Composite">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Composite" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="number_of_subcurves" type="UnsignedInteger" />
<array name="subcurves" dim="number_of_subcurves" type="CompositeSubCurve" />
<field name="is_closed" type="Boolean" />
</object>
<object name="CompositeSubCurve">
<field name="subcurve" type="PtrCurve" />
<field name="sense" type="Boolean" />
</object>
<object name="PRC_TYPE_CRV_OnSurf">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_OnSurf" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="tolerance" type="Double" />
<field name="uv_curve" type="PtrCurve" />
<field name="surface" type="PtrSurface" />
<field name="uv_domain" type="Domain" />
</object>
<object name="PRC_TYPE_CRV_Ellipse">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Ellipse" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="rx" type="Double" />
<field name="ry" type="Double" />
</object>
<object name="PRC_TYPE_CRV_Equation">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Equation" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="interval" type="Interval" />
<field name="x_function" type="PRC_TYPE_MATH_FCT_1D" />
<field name="y_function" type="PRC_TYPE_MATH_FCT_1D" />
<field name="z_function" type="PRC_TYPE_MATH_FCT_1D" condition="is_3d_flag == TRUE" />
</object>
<object name="PRC_TYPE_CRV_Helix01">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Helix01" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="type" type="Character" />
<field name="orientation" type="Boolean" />
<field name="start" type="Vector3d" />
<field name="type0_helix" type="Type0HelixData" condition="type == 0" />
<field name="type1_helix" type="Type1HelixData" condition="type == 1" />
</object>
<object name="Type0HelixData">
<field name="origin_0" type="Double" />
<field name="direction_0" type="Double" />
<field name="origin_1" type="Double" />
<field name="direction_1" type="Double" />
<field name="origin_2" type="Double" />
<field name="direction_2" type="Double" />
<field name="pitch" type="Double" />
<field name="radius" type="Double" />
</object>
<object name="Type1HelixData">
<field name="unit_z0" type="Double" />
<field name="unit_u0" type="Double" />
<field name="unit_z1" type="Double" />
<field name="unit_u1" type="Double" />
<field name="unit_z2" type="Double" />
<field name="unit_u2" type="Double" />
<field name="reserved_double_0" type="Double" />
<field name="reserved_double_1" type="Double" />
<field name="reserved_double_2" type="Double" />
<field name="reserved_double_3" type="Double" />
<field name="radius_law" type="PRC_TYPE_MATH_FCT_1D" />
<field name="z_law" type="PRC_TYPE_MATH_FCT_1D" />
<field name="theta_law" type="PRC_TYPE_MATH_FCT_1D" />
</object>
<object name="PRC_TYPE_CRV_Hyperbola">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Hyperbola" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="paramaterization" type="Parameterization" />
<field name="semi_axis" type="Double" />
<field name="semi_image_axis" type="Double" />
<field name="type" type="Character" />
</object>
<object name="PRC_TYPE_CRV_Intersection">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Intersection" />
<field name="curve_data" type="ContentCurve" />
<field name="has_transform" type="Boolean" />
<field name="transform" type="Transformation" condition="has_transform == TRUE" />
<field name="parameterization" type="Parameterization" />
<field name="surface_1" type="PtrSurface" />
<field name="surface_2" type="PtrSurface" />
<field name="sense_1" type="Boolean" />
<field name="sense_2" type="Boolean" />
<field name="sense_cross" type="Boolean" />
<field name="number_of_crossings" type="UnsignedInteger" />
<array name="crossings" dim="number_of_crossings" type="CrossingPointsCrvIntersection" />
<field name="start_limit_point" type="Vector3D" />
<field name="start_limit_type" type="UnsignedInteger" />
<field name="end_limit_point" type="Vector3D" />
<field name="end_limit_type" type="UnsignedInteger" />
<field name="chord_error" type="Double" />
<field name="angle_error" type="Double" />
<field name="param_respected" type="Boolean" />
</object>
<object name="CrossingPointsCrvIntersection">
<field name="position" type="Vector3D" />
<field name="uv_surface_1" type="Vector2D" />
<field name="uv_surface_2" type="Vector2D" />
<field name="tangent" type="Vector3D" />
<field name="parameter" type="Double" />
<field name="scale" type="Double" />
<field name="flags" type="Character" />
</object>
<object name="PRC_TYPE_CRV_Line">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Line" />
<field name="curve_data" type="ContentCurve" />
<field name="has_transform" type="Boolean" />
<field name="transform" type="Transformation" condition="has_transform == TRUE" />
<field name="parameterization" type="Parameterization" />
</object>
<object name="PRC_TYPE_CRV_Offset">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Offset" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="Parameterization" />
<field name="base_curve" type="PtrCurve" />
<field name="offset_plane_normal" type="Vector3D" />
<field name="offset" type="Double" />
</object>
<object name="PRC_TYPE_CRV_Parabola">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Parabola" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="Parameterization" />
<field name="focal_length" type="Double" />
<field name="type" type="Character" />
</object>
<object name="PRC_TYPE_CRV_PolyLine">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_PolyLine" />
<field name="curve_data" type="ContentCurve" />
<field name="has_transform" type="Boolean" />
<field name="transform" type="Transformation" condition="has_transform == TRUE" />
<field name="parameterization" type="Parameterization" />
<field name="number_of_points" type="UnsignedInteger" />
<array name="points" dim="number_of_points" type="PolyLinePoint" />
</object>
<object name="PolyLinePoint">
<field name="point_3d" type="Vector3D" conditions="is_3d_flag == TRUE" />
<field name="point_2d" type="Vector2D" conditions="is_3d_flag == FALSE" />
</object>
<object name="PRC_TYPE_CRV_Transform">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_CRV_Transform" />
<field name="curve_data" type="ContentCurve" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="Parameterization" />
<field name="base_curve" type="PtrCurve" />
<field name="math_transformation" type="PRC_TYPE_MATH_FCT_3D" />
</object>
<object name="ContentSurface">
<field name="has_base_geometry" type="Boolean" />
<field name="attribute_data" type="AttributeData" condition="has_base_geometry == TRUE" />
<field name="name" type="Name" condition="has_base_geometry == TRUE" />
<field name="id" type="UnsignedInteger" condition="has_base_geometry == TRUE" />
<field name="extend_type" type="UnsignedInteger" />
</object>
<object name="PRC_TYPE_SURF_Blend01">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_SURF_Blend01" />
<field name="curve_data" type="ContentSurface" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="UVParameterization" />
<field name="center_curve" type="PtrCurve" />
<field name="origin_curve" type="PtrCurve" />
<field name="tangent_curve" type="PtrCurve" />
</object>
<object name="PRC_TYPE_SURF_Blend02">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_SURF_Blend02" />
<field name="curve_data" type="ContentSurface" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="UVParameterization" />
<field name="bound_surface_0" type="PtrSurface" />
<field name="bound_curve_0" type="PtrCurve" />
<field name="bound_surface_1" type="PtrSurface" />
<field name="bound_curve_1" type="PtrCurve" />
<field name="center_curve" type="PtrCurve" />
<field name="center_curve_sense" type="Boolean" />
<field name="bound_surface_0_sense" type="Boolean" />
<field name="bound_surface_1_sense" type="Boolean" />
<field name="radius_0" type="Double" />
<field name="radius_1" type="Double" />
<field name="cliff_surface_0" type="PtrSurface" />
<field name="cliff_surface_1" type="PtrSurface" />
<field name="parameterization_type" type="Character" />
</object>
<object name="PRC_TYPE_SURF_Blend03">
<field name="" type="UnsignedInteger" constant="PRC_TYPE_SURF_Blend03" />
<field name="curve_data" type="ContentSurface" />
<field name="transform" type="Transformation" />
<field name="parameterization" type="UVParameterization" />
<field name="number_of_elements" type="Integer" />
<array name="parameters" dim="number_of_elements" type="Double" />
<array name="multiplicities" dim="number_of_elements" type="Integer" />
<array name="points" dim="number_of_elements" type="Vector3D" />
<array name="rail_2_angles_v" dim="number_of_elements" type="Double" />
<array name="tangents" dim="number_of_elements" type="Vector3D" />
<array name="rail_2_derivatives_v" dim="number_of_elements" type="Double" />
<array name="second_derivatives" dim="number_of_elements" type="Vector3D" />
<array name="rail_2_second_derivatives" dim="number_of_elements" type="Double" />
<field name="rail_2_parameter_v" type="Double" />
<field name="trim_v_min" type="Double" />
<field name="trim_v_max" type="Double" />
<array name="reserved_int" dim="6" type="Integer" />
<field name="reserved_char_0" type="Character" />
<field name="reserved_char_1" type="Character" />
<field name="reserved_char_2" type="Character" />
<field name="number_of_supplimental_doubles" type="Integer" />
<array name="supplimental_doubles" dim="number_of_supplimental_doubles" type="Double" />
</object>
</objects>
</prc>