123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- /*
- Open Asset Import Library (assimp)
- ----------------------------------------------------------------------
- Copyright (c) 2006-2024, assimp team
- All rights reserved.
- Redistribution and use of this software in source and binary forms,
- with or without modification, are permitted provided that the
- following conditions are met:
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the
- following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other
- materials provided with the distribution.
- * Neither the name of the assimp team, nor the names of its
- contributors may be used to endorse or promote products
- derived from this software without specific prior
- written permission of the assimp team.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ----------------------------------------------------------------------
- */
- #ifndef INCLUDED_AI_X3D_IMPORTER_H
- #define INCLUDED_AI_X3D_IMPORTER_H
- #include "X3DImporter_Node.hpp"
- #include <assimp/BaseImporter.h>
- #include <assimp/XmlParser.h>
- #include <assimp/importerdesc.h>
- #include <assimp/scene.h>
- #include <assimp/types.h>
- #include <assimp/DefaultLogger.hpp>
- #include <assimp/ProgressHandler.hpp>
- #include <list>
- #include <string>
- namespace Assimp {
- AI_WONT_RETURN inline void Throw_ArgOutOfRange(const std::string &argument) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_CloseNotFound(const std::string &node) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrF(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrD(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrB(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_ConvertFail_Str2ArrI(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_DEF_And_USE(const std::string &nodeName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_TagCountIncorrect(const std::string &pNode) AI_WONT_RETURN_SUFFIX;
- AI_WONT_RETURN inline void Throw_USE_NotFound(const std::string &nodeName, const std::string &pAttrValue) AI_WONT_RETURN_SUFFIX;
- inline void Throw_ArgOutOfRange(const std::string &argument) {
- throw DeadlyImportError("Argument value is out of range for: \"" + argument + "\".");
- }
- inline void Throw_CloseNotFound(const std::string &node) {
- throw DeadlyImportError("Close tag for node <" + node + "> not found. Seems file is corrupt.");
- }
- inline void Throw_ConvertFail_Str2ArrF(const std::string &nodeName, const std::string &pAttrValue) {
- throw DeadlyImportError("In <" + nodeName + "> failed to convert attribute value \"" + pAttrValue +
- "\" from string to array of floats.");
- }
- inline void Throw_ConvertFail_Str2ArrD(const std::string &nodeName, const std::string &pAttrValue) {
- throw DeadlyImportError("In <" + nodeName + "> failed to convert attribute value \"" + pAttrValue +
- "\" from string to array of doubles.");
- }
- inline void Throw_ConvertFail_Str2ArrB(const std::string &nodeName, const std::string &pAttrValue) {
- throw DeadlyImportError("In <" + nodeName + "> failed to convert attribute value \"" + pAttrValue +
- "\" from string to array of booleans.");
- }
- inline void Throw_ConvertFail_Str2ArrI(const std::string &nodeName, const std::string &pAttrValue) {
- throw DeadlyImportError("In <" + nodeName + "> failed to convert attribute value \"" + pAttrValue +
- "\" from string to array of integers.");
- }
- inline void Throw_DEF_And_USE(const std::string &nodeName) {
- throw DeadlyImportError("\"DEF\" and \"USE\" can not be defined both in <" + nodeName + ">.");
- }
- inline void Throw_IncorrectAttr(const std::string &nodeName, const std::string &pAttrName) {
- throw DeadlyImportError("Node <" + nodeName + "> has incorrect attribute \"" + pAttrName + "\".");
- }
- inline void Throw_IncorrectAttrValue(const std::string &nodeName, const std::string &pAttrName) {
- throw DeadlyImportError("Attribute \"" + pAttrName + "\" in node <" + nodeName + "> has incorrect value.");
- }
- inline void Throw_MoreThanOnceDefined(const std::string &nodeName, const std::string &pNodeType, const std::string &pDescription) {
- throw DeadlyImportError("\"" + pNodeType + "\" node can be used only once in " + nodeName + ". Description: " + pDescription);
- }
- inline void Throw_TagCountIncorrect(const std::string &pNode) {
- throw DeadlyImportError("Count of open and close tags for node <" + pNode + "> are not equivalent. Seems file is corrupt.");
- }
- inline void Throw_USE_NotFound(const std::string &nodeName, const std::string &pAttrValue) {
- throw DeadlyImportError("Not found node with name \"" + pAttrValue + "\" in <" + nodeName + ">.");
- }
- inline void LogInfo(const std::string &message) {
- DefaultLogger::get()->info(message);
- }
- /// \class X3DImporter
- /// Class that holding scene graph which include: groups, geometry, metadata etc.
- ///
- /// Limitations.
- ///
- /// Pay attention that X3D is format for interactive graphic and simulations for web browsers.
- /// So not all features can be imported using Assimp.
- ///
- /// Unsupported nodes:
- /// CAD geometry component:
- /// "CADAssembly", "CADFace", "CADLayer", "CADPart", "IndexedQuadSet", "QuadSet"
- /// Core component:
- /// "ROUTE", "ExternProtoDeclare", "ProtoDeclare", "ProtoInstance", "ProtoInterface", "WorldInfo"
- /// Distributed interactive simulation (DIS) component:
- /// "DISEntityManager", "DISEntityTypeMapping", "EspduTransform", "ReceiverPdu", "SignalPdu", "TransmitterPdu"
- /// Cube map environmental texturing component:
- /// "ComposedCubeMapTexture", "GeneratedCubeMapTexture", "ImageCubeMapTexture"
- /// Environmental effects component:
- /// "Background", "Fog", "FogCoordinate", "LocalFog", "TextureBackground"
- /// Environmental sensor component:
- /// "ProximitySensor", "TransformSensor", "VisibilitySensor"
- /// Followers component:
- /// "ColorChaser", "ColorDamper", "CoordinateChaser", "CoordinateDamper", "OrientationChaser", "OrientationDamper", "PositionChaser",
- /// "PositionChaser2D", "PositionDamper", "PositionDamper2D", "ScalarChaser", "ScalarDamper", "TexCoordChaser2D", "TexCoordDamper2D"
- /// Geospatial component:
- /// "GeoCoordinate", "GeoElevationGrid", "GeoLocation", "GeoLOD", "GeoMetadata", "GeoOrigin", "GeoPositionInterpolator", "GeoProximitySensor",
- /// "GeoTouchSensor", "GeoTransform", "GeoViewpoint"
- /// Humanoid Animation (H-Anim) component:
- /// "HAnimDisplacer", "HAnimHumanoid", "HAnimJoint", "HAnimSegment", "HAnimSite"
- /// Interpolation component:
- /// "ColorInterpolator", "CoordinateInterpolator", "CoordinateInterpolator2D", "EaseInEaseOut", "NormalInterpolator", "OrientationInterpolator",
- /// "PositionInterpolator", "PositionInterpolator2D", "ScalarInterpolator", "SplinePositionInterpolator", "SplinePositionInterpolator2D",
- /// "SplineScalarInterpolator", "SquadOrientationInterpolator",
- /// Key device sensor component:
- /// "KeySensor", "StringSensor"
- /// Layering component:
- /// "Layer", "LayerSet", "Viewport"
- /// Layout component:
- /// "Layout", "LayoutGroup", "LayoutLayer", "ScreenFontStyle", "ScreenGroup"
- /// Navigation component:
- /// "Billboard", "Collision", "LOD", "NavigationInfo", "OrthoViewpoint", "Viewpoint", "ViewpointGroup"
- /// Networking component:
- /// "EXPORT", "IMPORT", "Anchor", "LoadSensor"
- /// NURBS component:
- /// "Contour2D", "ContourPolyline2D", "CoordinateDouble", "NurbsCurve", "NurbsCurve2D", "NurbsOrientationInterpolator", "NurbsPatchSurface",
- /// "NurbsPositionInterpolator", "NurbsSet", "NurbsSurfaceInterpolator", "NurbsSweptSurface", "NurbsSwungSurface", "NurbsTextureCoordinate",
- /// "NurbsTrimmedSurface"
- /// Particle systems component:
- /// "BoundedPhysicsModel", "ConeEmitter", "ExplosionEmitter", "ForcePhysicsModel", "ParticleSystem", "PointEmitter", "PolylineEmitter",
- /// "SurfaceEmitter", "VolumeEmitter", "WindPhysicsModel"
- /// Picking component:
- /// "LinePickSensor", "PickableGroup", "PointPickSensor", "PrimitivePickSensor", "VolumePickSensor"
- /// Pointing device sensor component:
- /// "CylinderSensor", "PlaneSensor", "SphereSensor", "TouchSensor"
- /// Rendering component:
- /// "ClipPlane"
- /// Rigid body physics:
- /// "BallJoint", "CollidableOffset", "CollidableShape", "CollisionCollection", "CollisionSensor", "CollisionSpace", "Contact", "DoubleAxisHingeJoint",
- /// "MotorJoint", "RigidBody", "RigidBodyCollection", "SingleAxisHingeJoint", "SliderJoint", "UniversalJoint"
- /// Scripting component:
- /// "Script"
- /// Programmable shaders component:
- /// "ComposedShader", "FloatVertexAttribute", "Matrix3VertexAttribute", "Matrix4VertexAttribute", "PackagedShader", "ProgramShader", "ShaderPart",
- /// "ShaderProgram",
- /// Shape component:
- /// "FillProperties", "LineProperties", "TwoSidedMaterial"
- /// Sound component:
- /// "AudioClip", "Sound"
- /// Text component:
- /// "FontStyle", "Text"
- /// Texturing3D Component:
- /// "ComposedTexture3D", "ImageTexture3D", "PixelTexture3D", "TextureCoordinate3D", "TextureCoordinate4D", "TextureTransformMatrix3D",
- /// "TextureTransform3D"
- /// Texturing component:
- /// "MovieTexture", "MultiTexture", "MultiTextureCoordinate", "MultiTextureTransform", "PixelTexture", "TextureCoordinateGenerator",
- /// "TextureProperties",
- /// Time component:
- /// "TimeSensor"
- /// Event Utilities component:
- /// "BooleanFilter", "BooleanSequencer", "BooleanToggle", "BooleanTrigger", "IntegerSequencer", "IntegerTrigger", "TimeTrigger",
- /// Volume rendering component:
- /// "BlendedVolumeStyle", "BoundaryEnhancementVolumeStyle", "CartoonVolumeStyle", "ComposedVolumeStyle", "EdgeEnhancementVolumeStyle",
- /// "IsoSurfaceVolumeData", "OpacityMapVolumeStyle", "ProjectionVolumeStyle", "SegmentedVolumeData", "ShadedVolumeStyle",
- /// "SilhouetteEnhancementVolumeStyle", "ToneMappedVolumeStyle", "VolumeData"
- ///
- /// Supported nodes:
- /// Core component:
- /// "MetadataBoolean", "MetadataDouble", "MetadataFloat", "MetadataInteger", "MetadataSet", "MetadataString"
- /// Geometry2D component:
- /// "Arc2D", "ArcClose2D", "Circle2D", "Disk2D", "Polyline2D", "Polypoint2D", "Rectangle2D", "TriangleSet2D"
- /// Geometry3D component:
- /// "Box", "Cone", "Cylinder", "ElevationGrid", "Extrusion", "IndexedFaceSet", "Sphere"
- /// Grouping component:
- /// "Group", "StaticGroup", "Switch", "Transform"
- /// Lighting component:
- /// "DirectionalLight", "PointLight", "SpotLight"
- /// Networking component:
- /// "Inline"
- /// Rendering component:
- /// "Color", "ColorRGBA", "Coordinate", "IndexedLineSet", "IndexedTriangleFanSet", "IndexedTriangleSet", "IndexedTriangleStripSet", "LineSet",
- /// "PointSet", "TriangleFanSet", "TriangleSet", "TriangleStripSet", "Normal"
- /// Shape component:
- /// "Shape", "Appearance", "Material"
- /// Texturing component:
- /// "ImageTexture", "TextureCoordinate", "TextureTransform"
- ///
- /// Limitations of attribute "USE".
- /// If "USE" is set then node must be empty, like that:
- /// <Node USE='name'/>
- /// not the
- /// <Node USE='name'><!-- something --> </Node>
- ///
- /// Ignored attributes: "creaseAngle", "convex", "solid".
- ///
- /// Texture coordinates generating: only for Sphere, Cone, Cylinder. In all other case used PLANE mapping.
- /// It's better that Assimp main code has powerful texture coordinates generator. Then is not needed to
- /// duplicate this code in every importer.
- ///
- /// Lighting limitations.
- /// If light source placed in some group with "DEF" set. And after that some node is use it group with "USE" attribute then
- /// you will get error about duplicate light sources. That's happening because Assimp require names for lights but do not like
- /// duplicates of it )).
- ///
- /// Color for faces.
- /// That's happening when attribute "colorPerVertex" is set to "false". But Assimp do not hold how many colors has mesh and require
- /// equal length for mVertices and mColors. You will see the colors but vertices will use call which last used in "colorIdx".
- ///
- /// That's all for now. Enjoy
- ///
- using X3DElementList = std::list<X3DNodeElementBase *>;
- class X3DImporter : public BaseImporter {
- public:
- std::list<X3DNodeElementBase *> NodeElement_List; ///< All elements of scene graph.
- public:
- /// Default constructor.
- X3DImporter();
- /// Default destructor.
- ~X3DImporter();
- /***********************************************/
- /******** Functions: parse set, public *********/
- /***********************************************/
- /// Parse X3D file and fill scene graph. The function has no return value. Result can be found by analyzing the generated graph.
- /// Also exception can be thrown if trouble will found.
- /// \param [in] pFile - name of file to be parsed.
- /// \param [in] pIOHandler - pointer to IO helper object.
- void ParseFile(const std::string &file, IOSystem *pIOHandler);
- void ParseFile(std::istream &myIstream);
- void ParseFile(XmlParser &theParser);
- bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const;
- void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler);
- const aiImporterDesc *GetInfo() const;
- void Clear();
- private:
- X3DNodeElementBase *MACRO_USE_CHECKANDAPPLY(XmlNode &node, const std::string &pDEF, const std::string &pUSE, X3DElemType pType, X3DNodeElementBase *pNE);
- bool isNodeEmpty(XmlNode &node);
- void checkNodeMustBeEmpty(XmlNode &node);
- void skipUnsupportedNode(const std::string &pParentNodeName, XmlNode &node);
- void readHead(XmlNode &node);
- void readChildNodes(XmlNode &node, const std::string &pParentNodeName);
- void readScene(XmlNode &node);
- bool FindNodeElement_FromRoot(const std::string &pID, const X3DElemType pType, X3DNodeElementBase **pElement);
- bool FindNodeElement_FromNode(X3DNodeElementBase *pStartNode, const std::string &pID,
- const X3DElemType pType, X3DNodeElementBase **pElement);
- bool FindNodeElement(const std::string &pID, const X3DElemType pType, X3DNodeElementBase **pElement);
- void ParseHelper_Group_Begin(const bool pStatic = false);
- void ParseHelper_Node_Enter(X3DNodeElementBase *pNode);
- void ParseHelper_Node_Exit();
- // 2D geometry
- void readArc2D(XmlNode &node);
- void readArcClose2D(XmlNode &node);
- void readCircle2D(XmlNode &node);
- void readDisk2D(XmlNode &node);
- void readPolyline2D(XmlNode &node);
- void readPolypoint2D(XmlNode &node);
- void readRectangle2D(XmlNode &node);
- void readTriangleSet2D(XmlNode &node);
- // 3D geometry
- void readBox(XmlNode &node);
- void readCone(XmlNode &node);
- void readCylinder(XmlNode &node);
- void readElevationGrid(XmlNode &node);
- void readExtrusion(XmlNode &node);
- void readIndexedFaceSet(XmlNode &node);
- void readSphere(XmlNode &node);
- // group
- void startReadGroup(XmlNode &node);
- void endReadGroup();
- void startReadStaticGroup(XmlNode &node);
- void endReadStaticGroup();
- void startReadSwitch(XmlNode &node);
- void endReadSwitch();
- void startReadTransform(XmlNode &node);
- void endReadTransform();
- // light
- void readDirectionalLight(XmlNode &node);
- void readPointLight(XmlNode &node);
- void readSpotLight(XmlNode &node);
- // metadata
- bool checkForMetadataNode(XmlNode &node);
- void childrenReadMetadata(XmlNode &node, X3DNodeElementBase *pParentElement, const std::string &pNodeName);
- void readMetadataBoolean(XmlNode &node);
- void readMetadataDouble(XmlNode &node);
- void readMetadataFloat(XmlNode &node);
- void readMetadataInteger(XmlNode &node);
- void readMetadataSet(XmlNode &node);
- void readMetadataString(XmlNode &node);
- // networking
- void readInline(XmlNode &node);
- // postprocessing
- aiMatrix4x4 PostprocessHelper_Matrix_GlobalToCurrent() const;
- void PostprocessHelper_CollectMetadata(const X3DNodeElementBase &pNodeElement, std::list<X3DNodeElementBase *> &pList) const;
- bool PostprocessHelper_ElementIsMetadata(const X3DElemType pType) const;
- bool PostprocessHelper_ElementIsMesh(const X3DElemType pType) const;
- void Postprocess_BuildLight(const X3DNodeElementBase &pNodeElement, std::list<aiLight *> &pSceneLightList) const;
- void Postprocess_BuildMaterial(const X3DNodeElementBase &pNodeElement, aiMaterial **pMaterial) const;
- void Postprocess_BuildMesh(const X3DNodeElementBase &pNodeElement, aiMesh **pMesh) const;
- void Postprocess_BuildNode(const X3DNodeElementBase &pNodeElement, aiNode &pSceneNode, std::list<aiMesh *> &pSceneMeshList,
- std::list<aiMaterial *> &pSceneMaterialList, std::list<aiLight *> &pSceneLightList) const;
- void Postprocess_BuildShape(const X3DNodeElementShape &pShapeNodeElement, std::list<unsigned int> &pNodeMeshInd,
- std::list<aiMesh *> &pSceneMeshList, std::list<aiMaterial *> &pSceneMaterialList) const;
- void Postprocess_CollectMetadata(const X3DNodeElementBase &pNodeElement, aiNode &pSceneNode) const;
- // rendering
- void readColor(XmlNode &node);
- void readColorRGBA(XmlNode &node);
- void readCoordinate(XmlNode &node);
- void readIndexedLineSet(XmlNode &node);
- void readIndexedTriangleFanSet(XmlNode &node);
- void readIndexedTriangleSet(XmlNode &node);
- void readIndexedTriangleStripSet(XmlNode &node);
- void readLineSet(XmlNode &node);
- void readPointSet(XmlNode &node);
- void readTriangleFanSet(XmlNode &node);
- void readTriangleSet(XmlNode &node);
- void readTriangleStripSet(XmlNode &node);
- void readNormal(XmlNode &node);
- // shape
- void readShape(XmlNode &node);
- void readAppearance(XmlNode &node);
- void readMaterial(XmlNode &node);
- // texturing
- void readImageTexture(XmlNode &node);
- void readTextureCoordinate(XmlNode &node);
- void readTextureTransform(XmlNode &node);
- static const aiImporterDesc Description;
- X3DNodeElementBase *mNodeElementCur;
- aiScene *mScene;
- IOSystem *mpIOHandler;
- }; // class X3DImporter
- } // namespace Assimp
- #endif // INCLUDED_AI_X3D_IMPORTER_H
|