/**
 * PANDA 3D SOFTWARE
 * Copyright (c) Carnegie Mellon University.  All rights reserved.
 *
 * All use of this software is subject to the terms of the revised BSD
 * license.  You should have received a copy of this license along
 * with this source code in a file named "LICENSE."
 *
 * @file config_assimp.cxx
 * @author rdb
 * @date 2011-03-29
 */

#include "config_assimp.h"

#include "loaderFileTypeAssimp.h"

#include "dconfig.h"
#include "loaderFileTypeRegistry.h"

ConfigureDef(config_assimp);
NotifyCategoryDef(assimp, "");

ConfigureFn(config_assimp) {
  init_libassimp();
}

ConfigVariableBool assimp_calc_tangent_space
("assimp-calc-tangent-space", false,
 PRC_DESC("Calculates tangents and binormals for meshes imported via Assimp."));

ConfigVariableBool assimp_join_identical_vertices
("assimp-join-identical-vertices", true,
 PRC_DESC("Merges duplicate vertices.  Set this to false if you want each "
          "vertex to only be in use on one triangle."));

ConfigVariableBool assimp_improve_cache_locality
("assimp-improve-cache-locality", true,
 PRC_DESC("Improves rendering performance of the loaded meshes by reordering "
          "triangles for better vertex cache locality.  Set this to false if "
          "you need geometry to be loaded in the exact order that it was "
          "specified in the file, or to improve load performance."));

ConfigVariableBool assimp_remove_redundant_materials
("assimp-remove-redundant-materials", true,
 PRC_DESC("Removes redundant/unreferenced materials from assets."));

ConfigVariableBool assimp_fix_infacing_normals
("assimp-fix-infacing-normals", false,
 PRC_DESC("Determines which normal vectors are facing inward and inverts them "
          "so that they are facing outward."));

ConfigVariableBool assimp_optimize_meshes
("assimp-optimize-meshes", true,
 PRC_DESC("Reduces the number of draw calls by unifying geometry with the same "
          "materials.  Especially effective in conjunction with "
          "assimp-optimize-graph and assimp-remove-redundant-materials."));

ConfigVariableBool assimp_optimize_graph
("assimp-optimize-graph", false,
 PRC_DESC("Optimizes the scene geometry by flattening the scene hierarchy.  "
          "This is very efficient (combined with assimp-optimize-meshes), but "
          "it may result the hierarchy to become lost, so it is disabled by "
          "default."));

ConfigVariableBool assimp_flip_winding_order
("assimp-flip-winding-order", false,
 PRC_DESC("Set this true to flip the winding order of all models loaded via "
          "the Assimp loader.  Note that you may need to clear the model-cache "
          "after changing this."));

ConfigVariableBool assimp_gen_normals
("assimp-gen-normals", false,
 PRC_DESC("Set this true to generate normals (if absent from file) on import. "
          "See assimp-smooth-normal-angle for more information. "
          "Note that you may need to clear the model-cache after "
          "changing this."));

ConfigVariableDouble assimp_smooth_normal_angle
("assimp-smooth-normal-angle", 0.0,
 PRC_DESC("Set this to anything other than 0.0 in degrees (so 180.0 is PI) to "
          "specify the maximum angle that may be between two face normals at "
          "the same vertex position that are smoothed together. Sometimes "
          "referred to as 'crease angle'. Only has effect if "
          "assimp-gen-normals is set to true and the file does not contain "
          "normals. Note that you may need to clear the model-cache after "
          "changing this."));

ConfigVariableBool assimp_collapse_dummy_root_node
("assimp-collapse-dummy-root-node", true,
 PRC_DESC("If set to true, collapses the root node that Assimp creates, if it "
          "appears to be a synthetic dummy root node and contains no meshes.  "
          "This variable is new as of Panda3D 1.10.13 and will become true by "
          "default as of Panda3D 1.11.0."));

/**
 * Initializes the library.  This must be called at least once before any of
 * the functions or classes in this library can be used.  Normally it will be
 * called by the static initializers and need not be called explicitly, but
 * special cases exist.
 */
void
init_libassimp() {
  static bool initialized = false;
  if (initialized) {
    return;
  }
  initialized = true;

  LoaderFileTypeAssimp::init_type();

  LoaderFileTypeRegistry *reg = LoaderFileTypeRegistry::get_global_ptr();
  reg->register_type(new LoaderFileTypeAssimp);
}
