Program Listing for File AssimpExporter.h#
↰ Return to documentation for file (include/Karana/Scene/AssimpExporter.h)
/*
* Copyright (c) 2024-2026 Karana Dynamics Pty Ltd. All rights reserved.
*
* NOTICE TO USER:
*
* This source code and/or documentation (the "Licensed Materials") is
* the confidential and proprietary information of Karana Dynamics Inc.
* Use of these Licensed Materials is governed by the terms and conditions
* of a separate software license agreement between Karana Dynamics and the
* Licensee ("License Agreement"). Unless expressly permitted under that
* agreement, any reproduction, modification, distribution, or disclosure
* of the Licensed Materials, in whole or in part, to any third party
* without the prior written consent of Karana Dynamics is strictly prohibited.
*
* THE LICENSED MATERIALS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
* KARANA DYNAMICS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND
* FITNESS FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL KARANA DYNAMICS BE LIABLE FOR ANY DAMAGES WHATSOEVER,
* INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS, DATA, OR USE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, WHETHER IN CONTRACT, TORT,
* OR OTHERWISE ARISING OUT OF OR IN CONNECTION WITH THE LICENSED MATERIALS.
*
* U.S. Government End Users: The Licensed Materials are a "commercial item"
* as defined at 48 C.F.R. 2.101, and are provided to the U.S. Government
* only as a commercial end item under the terms of this license.
*
* Any use of the Licensed Materials in individual or commercial software must
* include, in the user documentation and internal source code comments,
* this Notice, Disclaimer, and U.S. Government Use Provision.
*/
/**
* @file
* @brief Declares the AssimpExporter implementation.
*/
#pragma once
#include "Karana/Scene/AbstractExporter.h"
#include <assimp/Exporter.hpp>
#include <optional>
#include <string>
namespace Karana::Scene {
/**
* @class AssimpExporter
* @brief Exporter implementation backed by the third-party ASSIMP library.
*
* AssimpExporter converts every ScenePartSpec to a triangulated Assimp mesh and writes an
* Assimp scene to disk. The exporter calls AbstractStaticGeometry::computeMesh() for each
* geometry, so built-in primitives, height fields, imported meshes, and user-defined static
* geometry all share the same output path.
*
* Materials are emitted as simple diffuse/specular or PBR-style scalar colors when the
* selected Assimp format supports them. Texture maps are referenced by filepath when they were
* created through kdFlex texture cache APIs and Texture::lookupFilepath() or
* GrayscaleTexture::lookupFilepath() can resolve the source image path.
*/
class AssimpExporter : public AbstractExporter {
public:
/**
* @brief Construct an exporter with automatic format detection.
*/
AssimpExporter();
/**
* @brief Export scene part specifications through Assimp.
*
* @param filename Destination file. If no explicit format id was configured, the extension
* is mapped to an Assimp exporter id such as "obj", "collada", or "gltf2".
* @param parts ScenePartSpec collection to write.
*
* @throws std::invalid_argument when the filename has no supported format extension.
* @throws std::runtime_error when Assimp rejects or cannot write the scene.
*/
void exportTo(const std::filesystem::path &filename,
const std::vector<ScenePartSpec> &parts) override;
/**
* @brief Set a concrete Assimp format id.
*
* @param format_id Assimp exporter id, for example "obj", "collada", "gltf2", or "stl".
*/
void setFormatId(std::string format_id);
/**
* @brief Clear the concrete Assimp format id and return to extension-based detection.
*/
void clearFormatId();
/**
* @brief Get the configured Assimp format id.
*
* @return The configured format id, or an empty string when extension detection is active.
*/
std::string formatId() const;
private:
/**
* @brief Assimp exporter object used to serialize aiScene instances.
*/
Assimp::Exporter _exporter;
/**
* @brief Optional explicit Assimp format id.
*/
std::optional<std::string> _format_id;
};
} // namespace Karana::Scene