//! Adds a standard data block (type: group node) to the chain of all data blocks.
//! Returns the total # of data blocks in the data block chain.
size_t U3DFileWriter::addStandardBlock_GroupNode(const std::string& groupNodeName, const std::string& parentNodeName)
{
    U3DDataBlockWriter GroupNodeBlock;
    GroupNodeBlock.blockType = mlU3D::BLOCKTYPE_GROUPNODE;

    GroupNodeBlock.writeString(groupNodeName);              // Write Group Node Name (9.5.1.1)
    _writeParentNodeData(GroupNodeBlock, parentNodeName);   // Write Parent Node Data (9.5.1.2) (Parent Node Name = empty --> = world)

    return addDataBlock(GroupNodeBlock);
}
//! Adds a standard data block (type: light node) to the chain of all data blocks.
//! Returns the total # of data blocks in the data block chain.
size_t U3DFileWriter::addStandardBlock_LightNode(const std::string& lightNodeName, const std::string& lightResourceName)
{
    U3DDataBlockWriter LightNodeBlock;
    LightNodeBlock.blockType = mlU3D::BLOCKTYPE_LIGHTNODE;

    LightNodeBlock.writeString(lightNodeName);      // Write Light Node Name (9.5.3.1)
    _writeParentNodeData(LightNodeBlock, "");       // Write Parent Node Data (9.5.3.2) (Parent Node Name = empty --> = world)
    LightNodeBlock.writeString(lightResourceName);  // Write Light Resource Name (9.5.3.1) (Same as Light Node Name)

    return addDataBlock(LightNodeBlock);
}
//! Adds a standard data block (type: model node) to the chain of all data blocks.
//! Returns the total # of data blocks in the data block chain.
size_t U3DFileWriter::addStandardBlock_ModelNode(const mlU3D::ModelNode& modelNode)
{
    U3DDataBlockWriter ModelNodeBlock;
    ModelNodeBlock.blockType = mlU3D::BLOCKTYPE_MODELNODE;
    std::string parentName = mlU3D::U3DTools::getParentNameFromGroupPath(modelNode.groupPath);

    ModelNodeBlock.writeString(modelNode.internalName);            // Write Model Node Name (9.5.2.1)

    _writeParentNodeData(ModelNodeBlock, parentName);              // Write Parent Node Data (9.5.2.2)

    ModelNodeBlock.writeString(modelNode.geometryGeneratorName);   // Write Model Resource Name (9.5.2.3)
    ModelNodeBlock.writeU32(modelNode.visibility);                 // Write Model Visibility (9.5.2.4);

    return addDataBlock(ModelNodeBlock);
}
//! Adds a standard data block (type: model node) to the chain of all data blocks.
//! Returns the total # of data blocks in the data block chain.
size_t U3DFileWriter::addStandardBlock_ModelNode(const U3DObjectInfoStruct& objectInfo)
{
  U3DDataBlockWriter ModelNodeBlock;
  ModelNodeBlock.blockType = U3D_BLOCKTYPE_MODELNODE;
  std::string parentName = getParentNameFromGroupPath(objectInfo.GroupPath);

  //ModelNodeBlock.writeString(objectInfo.DisplayName);        // Write Model Node Name (9.5.2.1) - Unfortunately, the model node name must be unique... :-(
  ModelNodeBlock.writeString(objectInfo.InternalName);       // Write Model Node Name (9.5.2.1)

  _writeParentNodeData(ModelNodeBlock, parentName);          // Write Parent Node Data (9.5.2.2)

  ModelNodeBlock.writeString(objectInfo.ResourceName);       // Write Model Resource Name (9.5.2.3) 
  ModelNodeBlock.writeU32(objectInfo.Visibility);            // Write Model Visibility (9.5.2.4);

  return addDataBlock(ModelNodeBlock);
}
//! Adds a standard data block (type: view node) to the chain of all data blocks.
//! Returns the total # of data blocks in the data block chain.
size_t U3DFileWriter::addStandardBlock_ViewNode(const std::string& viewNodeName, const std::string& viewResourceName)
{
    U3DDataBlockWriter ViewNodeBlock;
    ViewNodeBlock.blockType = mlU3D::BLOCKTYPE_VIEWNODE;

    ViewNodeBlock.writeString(viewNodeName);                   // Write View Node Name (9.5.4.1)
    _writeParentNodeData(ViewNodeBlock, "");                   // Write Parent Node Data (9.5.4.2) (Parent Node Name = empty --> = world)
    ViewNodeBlock.writeString(viewResourceName);               // Write View Resource Name (9.5.4.3) (Same as View Node Name) [UNUSED BY ACROBAT]
    ViewNodeBlock.writeU32(mlU3D::VIEWNODEATTRIBUTE_DEFAULT);  // Write View Node Attributes (9.5.4.4)
    ViewNodeBlock.writeF32(0.0f);                              // Write View Near Clip (9.5.4.5.1)
    ViewNodeBlock.writeF32(0.0f);                              // Write View Far Clip (9.5.4.5.2)
    ViewNodeBlock.writeF32(0.0f);                              // Write View Projection (9.5.4.6.1)
    //ViewNodeBlock.writeF32(0.0f);                            // Write View Orthographic Height (9.5.4.6.2) (only for orthographic projection) [UNUSED BY ACROBAT]
    ViewNodeBlock.writeF32(100.0f);                            // Write View Port Width (9.5.4.7.1)
    ViewNodeBlock.writeF32(100.0f);                            // Write View Port Height (9.5.4.7.2)
    ViewNodeBlock.writeF32(50.0f);                             // Write View Port Horizontal Position (9.5.4.7.3)
    ViewNodeBlock.writeF32(50.0f);                             // Write View Port Vertical Position (9.5.4.7.4)
    ViewNodeBlock.writeU32(0x00000000);                        // Write Backdrop Count (9.5.4.8) [UNUSED BY ACROBAT]
    ViewNodeBlock.writeU32(0x00000000);                        // Write Overlay Count (9.5.4.10) [UNUSED BY ACROBAT]

    return addDataBlock(ViewNodeBlock);
}