123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- /*
- Open Asset Import Library (assimp)
- ----------------------------------------------------------------------
- Copyright (c) 2006-2025, 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.
- ----------------------------------------------------------------------
- */
- /** @file ACLoader.h
- * @brief Declaration of the .ac importer class.
- */
- #ifndef AI_AC3DLOADER_H_INCLUDED
- #define AI_AC3DLOADER_H_INCLUDED
- #include <vector>
- #include <assimp/BaseImporter.h>
- #include <assimp/types.h>
- struct aiNode;
- struct aiMesh;
- struct aiMaterial;
- struct aiLight;
- namespace Assimp {
- // ---------------------------------------------------------------------------
- /** AC3D (*.ac) importer class
- */
- class AC3DImporter : public BaseImporter {
- public:
- AC3DImporter();
- ~AC3DImporter() override = default;
- // Represents an AC3D material
- struct Material {
- Material() :
- rgb(0.6f, 0.6f, 0.6f),
- spec(1.f, 1.f, 1.f),
- shin(0.f),
- trans(0.f) {}
- // base color of the material
- aiColor3D rgb;
- // ambient color of the material
- aiColor3D amb;
- // emissive color of the material
- aiColor3D emis;
- // specular color of the material
- aiColor3D spec;
- // shininess exponent
- float shin;
- // transparency. 0 == opaque
- float trans;
- // name of the material. optional.
- std::string name;
- };
- // Represents an AC3D surface
- struct Surface {
- Surface() :
- mat(0),
- flags(0) {}
- unsigned int mat, flags;
- using SurfaceEntry = std::pair<unsigned int, aiVector2D>;
- std::vector<SurfaceEntry> entries;
- // Type is low nibble of flags
- enum Type : uint8_t {
- Polygon = 0x0,
- ClosedLine = 0x1,
- OpenLine = 0x2,
- TriangleStrip = 0x4, // ACC extension (TORCS and Speed Dreams)
- Mask = 0xf,
- };
- inline uint8_t GetType() const { return (flags & Mask); }
- };
- // Represents an AC3D object
- struct Object {
- Object() :
- type(World),
- name(),
- children(),
- texRepeat(1.f, 1.f),
- texOffset(0.0f, 0.0f),
- rotation(),
- translation(),
- vertices(),
- surfaces(),
- numRefs(0),
- subDiv(0),
- crease() {}
- // Type description
- enum Type {
- World = 0x0,
- Poly = 0x1,
- Group = 0x2,
- Light = 0x4
- } type;
- // name of the object
- std::string name;
- // object children
- std::vector<Object> children;
- // texture to be assigned to all surfaces of the object
- // the .acc format supports up to 4 textures
- std::vector<std::string> textures;
- // texture repat factors (scaling for all coordinates)
- aiVector2D texRepeat, texOffset;
- // rotation matrix
- aiMatrix3x3 rotation;
- // translation vector
- aiVector3D translation;
- // vertices
- std::vector<aiVector3D> vertices;
- // surfaces
- std::vector<Surface> surfaces;
- // number of indices (= num verts in verbose format)
- unsigned int numRefs;
- // number of subdivisions to be performed on the
- // imported data
- unsigned int subDiv;
- // max angle limit for smoothing
- float crease;
- };
- public:
- // -------------------------------------------------------------------
- /** Returns whether the class can handle the format of the given file.
- * See BaseImporter::CanRead() for details.
- */
- bool CanRead(const std::string &pFile, IOSystem *pIOHandler,
- bool checkSig) const override;
- protected:
- // -------------------------------------------------------------------
- /** Return importer meta information.
- * See #BaseImporter::GetInfo for the details */
- const aiImporterDesc *GetInfo() const override;
- // -------------------------------------------------------------------
- /** Imports the given file into the given scene structure.
- * See BaseImporter::InternReadFile() for details*/
- void InternReadFile(const std::string &pFile, aiScene *pScene,
- IOSystem *pIOHandler) override;
- // -------------------------------------------------------------------
- /** Called prior to ReadFile().
- * The function is a request to the importer to update its configuration
- * basing on the Importer's configuration property list.*/
- void SetupProperties(const Importer *pImp) override;
- private:
- // -------------------------------------------------------------------
- /** Get the next line from the file.
- * @return false if the end of the file was reached*/
- bool GetNextLine();
- // -------------------------------------------------------------------
- /** Load the object section. This method is called recursively to
- * load subobjects, the method returns after a 'kids 0' was
- * encountered.
- * @objects List of output objects*/
- bool LoadObjectSection(std::vector<Object> &objects);
- // -------------------------------------------------------------------
- /** Convert all objects into meshes and nodes.
- * @param object Current object to work on
- * @param meshes Pointer to the list of output meshes
- * @param outMaterials List of output materials
- * @param materials Material list
- * @param Scenegraph node for the object */
- aiNode *ConvertObjectSection(Object &object,
- std::vector<aiMesh *> &meshes,
- std::vector<aiMaterial *> &outMaterials,
- const std::vector<Material> &materials,
- aiNode *parent = nullptr);
- // -------------------------------------------------------------------
- /** Convert a material
- * @param object Current object
- * @param matSrc Source material description
- * @param matDest Destination material to be filled */
- void ConvertMaterial(const Object &object,
- const Material &matSrc,
- aiMaterial &matDest);
- private:
- // points to the next data line
- aiBuffer mBuffer;
- // Configuration option: if enabled, up to two meshes
- // are generated per material: those faces who have
- // their bf cull flags set are separated.
- bool configSplitBFCull;
- // Configuration switch: subdivision surfaces are only
- // evaluated if the value is true.
- bool configEvalSubdivision;
- // counts how many objects we have in the tree.
- // basing on this information we can find a
- // good estimate how many meshes we'll have in the final scene.
- unsigned int mNumMeshes;
- // current list of light sources
- std::vector<aiLight *> *mLights;
- // name counters
- unsigned int mLightsCounter, mGroupsCounter, mPolysCounter, mWorldsCounter;
- };
- } // end of namespace Assimp
- #endif // AI_AC3DIMPORTER_H_INC
|