0030691: Data Exchange - implement import of mesh data from files in glTF format
[occt.git] / src / RWGltf / RWGltf_GltfLatePrimitiveArray.cxx
diff --git a/src/RWGltf/RWGltf_GltfLatePrimitiveArray.cxx b/src/RWGltf/RWGltf_GltfLatePrimitiveArray.cxx
new file mode 100644 (file)
index 0000000..fa486da
--- /dev/null
@@ -0,0 +1,133 @@
+// Author: Kirill Gavrilov
+// Copyright (c) 2018-2019 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <RWGltf_GltfLatePrimitiveArray.hxx>
+
+#include <RWGltf_MaterialMetallicRoughness.hxx>
+#include <RWGltf_MaterialCommon.hxx>
+
+#include <Message.hxx>
+#include <Message_Messenger.hxx>
+#include <OSD_OpenFile.hxx>
+#include <Standard_ArrayStreamBuffer.hxx>
+
+#include <fstream>
+
+IMPLEMENT_STANDARD_RTTIEXT(RWGltf_GltfLatePrimitiveArray, Poly_Triangulation)
+
+// =======================================================================
+// function : RWGltf_GltfLatePrimitiveArray
+// purpose  :
+// =======================================================================
+RWGltf_GltfLatePrimitiveArray::RWGltf_GltfLatePrimitiveArray (const TCollection_AsciiString& theId,
+                                                              const TCollection_AsciiString& theName)
+: Poly_Triangulation (3, 1, false),
+  myId (theId),
+  myName (theName),
+  myPrimMode (RWGltf_GltfPrimitiveMode_UNKNOWN)
+{
+  SetBoundingBox (Bnd_Box());
+}
+
+// =======================================================================
+// function : ~RWGltf_GltfLatePrimitiveArray
+// purpose  :
+// =======================================================================
+RWGltf_GltfLatePrimitiveArray::~RWGltf_GltfLatePrimitiveArray()
+{
+  //
+}
+
+// =======================================================================
+// function : BaseColor
+// purpose  :
+// =======================================================================
+Quantity_ColorRGBA RWGltf_GltfLatePrimitiveArray::BaseColor() const
+{
+  if (!myMaterialPbr.IsNull())
+  {
+    return myMaterialPbr->BaseColor;
+  }
+  else if (!myMaterialCommon.IsNull())
+  {
+    return Quantity_ColorRGBA (myMaterialCommon->DiffuseColor, 1.0f - myMaterialCommon->Transparency);
+  }
+  return Quantity_ColorRGBA();
+}
+
+// =======================================================================
+// function : AddPrimArrayData
+// purpose  :
+// =======================================================================
+RWGltf_GltfPrimArrayData& RWGltf_GltfLatePrimitiveArray::AddPrimArrayData (RWGltf_GltfArrayType theType)
+{
+  if (theType == RWGltf_GltfArrayType_Position)
+  {
+    // make sure positions go first
+    myData.Prepend (RWGltf_GltfPrimArrayData (theType));
+    return myData.ChangeFirst();
+  }
+  else if (theType == RWGltf_GltfArrayType_Indices)
+  {
+    // make sure indexes go after vertex positions but before any other vertex attributes
+    if (myData.First().Type == RWGltf_GltfArrayType_Position)
+    {
+      myData.InsertAfter (myData.Lower(), RWGltf_GltfPrimArrayData (theType));
+      return myData.ChangeValue (myData.Lower() + 1);
+    }
+    else
+    {
+      myData.Prepend (RWGltf_GltfPrimArrayData (theType));
+      return myData.ChangeFirst();
+    }
+  }
+  else
+  {
+    myData.Append (RWGltf_GltfPrimArrayData (theType));
+    return myData.ChangeLast();
+  }
+}
+
+// =======================================================================
+// function : SetBoundingBox
+// purpose  :
+// =======================================================================
+void RWGltf_GltfLatePrimitiveArray::SetBoundingBox (const Bnd_Box& theBox)
+{
+  myBox = theBox;
+
+  if (theBox.IsVoid())
+  {
+    Poly_Triangulation::myNodes = TColgp_Array1OfPnt();
+    Poly_Triangulation::myTriangles = Poly_Array1OfTriangle();
+    return;
+  }
+
+  // define 8 nodes so that AABB will be huge enough to include mesh even with transformation applied
+  Poly_Triangulation::myNodes.Resize (1, 8, false);
+  const gp_Pnt aMin = theBox.CornerMin();
+  const gp_Pnt aMax = theBox.CornerMax();
+  Poly_Triangulation::ChangeNode(1).SetCoord(aMin.X(), aMin.Y(), aMin.Z());
+  Poly_Triangulation::ChangeNode(2).SetCoord(aMax.X(), aMax.Y(), aMax.Z());
+  Poly_Triangulation::ChangeNode(3).SetCoord(aMin.X(), aMin.Y(), aMax.Z());
+  Poly_Triangulation::ChangeNode(4).SetCoord(aMin.X(), aMax.Y(), aMax.Z());
+  Poly_Triangulation::ChangeNode(5).SetCoord(aMax.X(), aMax.Y(), aMin.Z());
+  Poly_Triangulation::ChangeNode(6).SetCoord(aMax.X(), aMin.Y(), aMin.Z());
+  Poly_Triangulation::ChangeNode(7).SetCoord(aMin.X(), aMax.Y(), aMin.Z());
+  Poly_Triangulation::ChangeNode(8).SetCoord(aMax.X(), aMin.Y(), aMax.Z());
+
+  Poly_Triangulation::myTriangles.Resize (1, 1, false);
+  Poly_Triangulation::ChangeTriangle (1).Set (1, 2, 1);
+  //Poly_Triangulation::myTriangles = Poly_Array1OfTriangle();
+}