/* 
 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
 *
 * Redistribution and use 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 NVIDIA CORPORATION nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``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.
 */


#pragma once

#include <sutil.h>
#include <Mesh.h>
#include <optixu/optixpp_namespace.h>
#include <optixu/optixu_matrix_namespace.h>


//------------------------------------------------------------------------------
//
// OptiX mesh consisting of a single geometry instance with one or more
// materials.
//
// Mesh buffer variables are set on Geometry node:
//   vertex_buffer  : float3 vertex positions
//   normal_buffer  : float3 per vertex normals, may be zero length 
//   texcoord_buffer: float2 vertex texture coordinates, may be zero length
//   index_buffer   : int3 indices shared by vertex, normal, texcoord buffers 
//   material_buffer: int indices into material list
//
//------------------------------------------------------------------------------
struct OptiXMesh
{
  // Input
  optix::Context               context;       // required
  optix::Material              material;      // optional single matl override

  optix::Program               intersection;  // optional 
  optix::Program               bounds;        // optional
  
  optix::Program               closest_hit;   // optional multi matl override
  optix::Program               any_hit;       // optional

  // Output
  optix::GeometryInstance      geom_instance;
  optix::float3                bbox_min;
  optix::float3                bbox_max;

  int                          num_triangles;
};


SUTILAPI void loadMesh(
    const std::string&        filename,
    OptiXMesh&                mesh, 
    const optix::Matrix4x4&   load_xform = optix::Matrix4x4::identity()
    );
