nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2012, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file LWSLoader.h nuclear@0: * @brief Declaration of the LightWave scene importer class. nuclear@0: */ nuclear@0: #ifndef AI_LWSLOADER_H_INCLUDED nuclear@0: #define AI_LWSLOADER_H_INCLUDED nuclear@0: nuclear@0: #include "LWOFileData.h" nuclear@0: #include "SceneCombiner.h" nuclear@0: nuclear@0: namespace Assimp { nuclear@0: namespace LWS { nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Represents an element in a LWS file. nuclear@0: * nuclear@0: * This can either be a single data line - or a data nuclear@0: * group - { name ... n } nuclear@0: */ nuclear@0: class Element nuclear@0: { nuclear@0: public: nuclear@0: Element() nuclear@0: {} nuclear@0: nuclear@0: // first: name, second: rest nuclear@0: std::string tokens[2]; nuclear@0: std::list children; nuclear@0: nuclear@0: //! Recursive parsing function nuclear@0: void Parse (const char*& buffer); nuclear@0: }; nuclear@0: nuclear@0: #define AI_LWS_MASK (0xffffffff >> 4u) nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Represents a LWS scenegraph element nuclear@0: */ nuclear@0: struct NodeDesc nuclear@0: { nuclear@0: NodeDesc() nuclear@0: : number (0) nuclear@0: , parent (0) nuclear@0: , name ("") nuclear@0: , isPivotSet (false) nuclear@0: , lightColor (1.f,1.f,1.f) nuclear@0: , lightIntensity (1.f) nuclear@0: , lightType (0) nuclear@0: , lightFalloffType (0) nuclear@0: , lightConeAngle (45.f) nuclear@0: , parent_resolved (NULL) nuclear@0: {} nuclear@0: nuclear@0: enum { nuclear@0: nuclear@0: OBJECT = 1, nuclear@0: LIGHT = 2, nuclear@0: CAMERA = 3, nuclear@0: BONE = 4 nuclear@0: } type; // type of node nuclear@0: nuclear@0: // if object: path nuclear@0: std::string path; nuclear@0: unsigned int id; nuclear@0: nuclear@0: // number of object nuclear@0: unsigned int number; nuclear@0: nuclear@0: // index of parent index nuclear@0: unsigned int parent; nuclear@0: nuclear@0: // lights & cameras & dummies: name nuclear@0: const char* name; nuclear@0: nuclear@0: // animation channels nuclear@0: std::list< LWO::Envelope > channels; nuclear@0: nuclear@0: // position of pivot point nuclear@0: aiVector3D pivotPos; nuclear@0: bool isPivotSet; nuclear@0: nuclear@0: nuclear@0: nuclear@0: // color of light source nuclear@0: aiColor3D lightColor; nuclear@0: nuclear@0: // intensity of light source nuclear@0: float lightIntensity; nuclear@0: nuclear@0: // type of light source nuclear@0: unsigned int lightType; nuclear@0: nuclear@0: // falloff type of light source nuclear@0: unsigned int lightFalloffType; nuclear@0: nuclear@0: // cone angle of (spot) light source nuclear@0: float lightConeAngle; nuclear@0: nuclear@0: // soft cone angle of (spot) light source nuclear@0: float lightEdgeAngle; nuclear@0: nuclear@0: nuclear@0: nuclear@0: // list of resolved children nuclear@0: std::list< NodeDesc* > children; nuclear@0: nuclear@0: // resolved parent node nuclear@0: NodeDesc* parent_resolved; nuclear@0: nuclear@0: nuclear@0: // for std::find() nuclear@0: bool operator == (unsigned int num) const { nuclear@0: if (!num) nuclear@0: return false; nuclear@0: unsigned int _type = num >> 28u; nuclear@0: nuclear@0: return _type == static_cast(type) && (num & AI_LWS_MASK) == number; nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: } // end namespace LWS nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** LWS (LightWave Scene Format) importer class. nuclear@0: * nuclear@0: * This class does heavily depend on the LWO importer class. LWS files nuclear@0: * contain mainly descriptions how LWO objects are composed together nuclear@0: * in a scene. nuclear@0: */ nuclear@0: class LWSImporter : public BaseImporter nuclear@0: { nuclear@0: public: nuclear@0: LWSImporter(); nuclear@0: ~LWSImporter(); nuclear@0: nuclear@0: nuclear@0: public: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Check whether we can read a specific file nuclear@0: bool CanRead( const std::string& pFile, IOSystem* pIOHandler, nuclear@0: bool checkSig) const; nuclear@0: nuclear@0: protected: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Get list of supported extensions nuclear@0: const aiImporterDesc* GetInfo () const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Import file into given scene data structure nuclear@0: void InternReadFile( const std::string& pFile, aiScene* pScene, nuclear@0: IOSystem* pIOHandler); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Setup import properties nuclear@0: void SetupProperties(const Importer* pImp); nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Read an envelope description nuclear@0: void ReadEnvelope(const LWS::Element& dad, LWO::Envelope& out ); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Read an envelope description for the older LW file format nuclear@0: void ReadEnvelope_Old(std::list< LWS::Element >::const_iterator& it, nuclear@0: const std::list< LWS::Element >::const_iterator& end, nuclear@0: LWS::NodeDesc& nodes, nuclear@0: unsigned int version); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Setup a nice name for a node nuclear@0: void SetupNodeName(aiNode* nd, LWS::NodeDesc& src); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Recursively build the scenegraph nuclear@0: void BuildGraph(aiNode* nd, nuclear@0: LWS::NodeDesc& src, nuclear@0: std::vector& attach, nuclear@0: BatchLoader& batch, nuclear@0: aiCamera**& camOut, nuclear@0: aiLight**& lightOut, nuclear@0: std::vector& animOut); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: // Try several dirs until we find the right location of a LWS file. nuclear@0: std::string FindLWOFile(const std::string& in); nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: bool configSpeedFlag; nuclear@0: IOSystem* io; nuclear@0: nuclear@0: double first,last,fps; nuclear@0: nuclear@0: bool noSkeletonMesh; nuclear@0: }; nuclear@0: nuclear@0: } // end of namespace Assimp nuclear@0: nuclear@0: #endif // AI_LWSIMPORTER_H_INC