static void writeTexture (BinObjMgt_Persistent& theTarget,
const Handle(Image_Texture)& theImage)
{
- theTarget.PutAsciiString (!theImage.IsNull()
- && !theImage->FilePath().IsEmpty()
- && theImage->FileOffset() == -1
- ? theImage->FilePath()
- : "");
+ if (theImage.IsNull())
+ {
+ theTarget.PutAsciiString("");
+ return;
+ }
+ if (theImage->DataBuffer().IsNull())
+ {
+ theTarget.PutAsciiString(theImage->FilePath());
+ theTarget.PutBoolean(false);
+ if (theImage->FileOffset() == -1 || theImage->FileLength() == -1)
+ {
+ theTarget.PutBoolean(true);
+ return;
+ }
+ theTarget.PutBoolean(false);
+ theTarget.PutInteger(static_cast<int>(theImage->FileOffset()));
+ theTarget.PutInteger(static_cast<int>(theImage->FileLength()));
+ return;
+ }
+ theTarget.PutAsciiString(theImage->TextureId());
+ theTarget.PutBoolean(true);
+ theTarget.PutInteger(static_cast<int>(theImage->DataBuffer()->Size()));
+ theTarget.PutByteArray((Standard_Byte*)theImage->DataBuffer()->Data(),
+ static_cast<int>(theImage->DataBuffer()->Size()));
}
//! Decode texture path.
static void readTexture (const BinObjMgt_Persistent& theSource,
Handle(Image_Texture)& theTexture)
{
- TCollection_AsciiString aPath;
- theSource.GetAsciiString (aPath);
- if (!aPath.IsEmpty())
+ TCollection_AsciiString aStr;
+ theSource.GetAsciiString(aStr);
+ if (aStr.IsEmpty())
{
- theTexture = new Image_Texture (aPath);
+ return;
+ }
+ Standard_Boolean anUseBuffer;
+ if (!theSource.GetBoolean(anUseBuffer).IsOK())
+ {
+ theTexture = new Image_Texture(aStr);
+ return;
+ }
+ Standard_Integer anOffset = -1, aLength = -1;
+ if (!anUseBuffer)
+ {
+ Standard_Boolean isOnlyFilePath;
+ theSource.GetBoolean(isOnlyFilePath);
+ if (isOnlyFilePath)
+ {
+ theTexture = new Image_Texture(aStr);
+ return;
+ }
+ theSource.GetInteger(anOffset);
+ theSource.GetInteger(aLength);
+ theTexture = new Image_Texture(aStr, anOffset, aLength);
+ return;
}
+ theSource.GetInteger(aLength);
+ Handle(NCollection_Buffer) aBuff =
+ new NCollection_Buffer(NCollection_BaseAllocator::CommonBaseAllocator(), aLength);
+ theSource.GetByteArray(aBuff->ChangeData(), aLength);
+ theTexture = new Image_Texture(aBuff, aStr);
}
//=======================================================================
#include <XmlMXCAFDoc_VisMaterialDriver.hxx>
+#include <Message.hxx>
#include <Message_Messenger.hxx>
#include <XCAFDoc_VisMaterial.hxx>
#include <XmlObjMgt.hxx>
+#include <XmlObjMgt_Document.hxx>
#include <XmlObjMgt_Persistent.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XmlMXCAFDoc_VisMaterialDriver, XmlMDF_ADriver)
IMPLEMENT_DOMSTRING(Shininess, "shininess")
IMPLEMENT_DOMSTRING(Transparency, "transparency")
IMPLEMENT_DOMSTRING(DiffuseTexture, "diffuse_texture")
+IMPLEMENT_DOMSTRING(FilePath, "file_path")
+IMPLEMENT_DOMSTRING(TextureId, "texture_id")
+IMPLEMENT_DOMSTRING(Offset, "offset")
+IMPLEMENT_DOMSTRING(Length, "length")
//! Encode alpha mode into character.
static const char* alphaModeToString (Graphic3d_AlphaMode theMode)
const XmlObjMgt_DOMString& theName,
const Handle(Image_Texture)& theImage)
{
- if (!theImage.IsNull()
- && !theImage->FilePath().IsEmpty()
- && theImage->FileOffset() == -1)
+ if (theImage.IsNull())
{
- theTarget.Element().setAttribute (theName, theImage->FilePath().ToCString());
+ return;
+ }
+ XmlObjMgt_Document aDoc(theTarget.Element().getOwnerDocument());
+ XmlObjMgt_Element aCurTarget = aDoc.createElement(theName);
+ theTarget.Element().appendChild(aCurTarget);
+ if (theImage->DataBuffer().IsNull())
+ {
+ aCurTarget.setAttribute(::FilePath(), theImage->FilePath().ToCString());
+ if (theImage->FileOffset() == -1 || theImage->FileLength() == -1)
+ {
+ return;
+ }
+ aCurTarget.setAttribute(::Offset(), static_cast<int>(theImage->FileOffset()));
+ aCurTarget.setAttribute(::Length(), static_cast<int>(theImage->FileLength()));
+ }
+ else
+ {
+ Message::SendWarning(TCollection_AsciiString("Can't write a texture to buffer."));
}
}
const XmlObjMgt_DOMString& theName,
Handle(Image_Texture)& theImage)
{
- TCollection_AsciiString aPath (theElement.getAttribute (theName).GetString());
- if (!aPath.IsEmpty())
+ TCollection_AsciiString aStr(theElement.getAttribute(theName).GetString());
+ if (!aStr.IsEmpty())
+ {
+ theImage = new Image_Texture(aStr);
+ return;
+ }
+ LDOM_Element anElement = theElement.GetChildByTagName(theName);
+ if (anElement.isNull())
+ {
+ return;
+ }
+ TCollection_AsciiString aFilePath(anElement.getAttribute(::FilePath()).GetString());
+ TCollection_AsciiString anId(anElement.getAttribute(::TextureId()).GetString());
+ Standard_Integer anOffset = -1, aLength = -1;
+ if (!aFilePath.IsEmpty())
+ {
+ anElement.getAttribute(::Offset()).GetInteger(anOffset);
+ anElement.getAttribute(::Length()).GetInteger(aLength);
+ if (anOffset == -1 || aLength == -1)
+ {
+ theImage = new Image_Texture(aFilePath);
+ return;
+ }
+ theImage = new Image_Texture(aFilePath, anOffset, aLength);
+ }
+ else if (!anId.IsEmpty())
{
- theImage = new Image_Texture (aPath);
+ Message::SendWarning(TCollection_AsciiString("Can't read a texture from buffer."));
}
}
-pload XDE
+pload XDE OCAF VISUALISATION
set subgroup xde
--- /dev/null
+puts "========"
+puts "0033183: Data Exchange - Lose texture after saving XBF file"
+puts "Checking saving of textures for the previous version"
+puts "========"
+
+Close D -silent
+XOpen [locate_data_file bug33183_ship_boat.xbf] D
+set data [XGetVisMaterial D 0:1:10:3]
+
+if {[string first "Common.DiffuseTexture" $data] == -1} {
+ puts "Error: Texture is not found"
+}
+
+vinit View1
+XDisplay -dispMode 1 D
+vfit
+if { [vreadpixel 130 300 rgb name] != "ROSYBROWN" } { puts "Error: color not match" }
+if { [vreadpixel 150 250 rgb name] != "ORANGE2" } { puts "Error: color not match" }
+if { [vreadpixel 250 250 rgb name] != "GRAY43" } { puts "Error: color not match" }
+
+Close D
--- /dev/null
+puts "========"
+puts "0033183: Data Exchange - Lose texture after saving XBF file"
+puts "Checking saving of textures for the previous version"
+puts "========"
+
+Close D -silent
+XOpen [locate_data_file bug33183_ship_boat.xml] D
+set data [XGetVisMaterial D 0:1:10:3]
+
+if {[string first "Common.DiffuseTexture" $data] == -1} {
+ puts "Error: Texture is not found"
+}
+
+vinit View1
+XDisplay -dispMode 1 D
+vfit
+if { [vreadpixel 130 300 rgb name] != "ROSYBROWN" } { puts "Error: color not match" }
+if { [vreadpixel 150 250 rgb name] != "ORANGE2" } { puts "Error: color not match" }
+if { [vreadpixel 250 250 rgb name] != "GRAY43" } { puts "Error: color not match" }
+
+Close D