Files
MAXINE-AR-SDK/samples/ExpressionApp/MeshRenderer.h
Joy D'Souza ca10ac3b39 v0.8.2.0 Release
v0.8.2.0 Release
2023-01-06 10:03:38 -08:00

154 lines
7.5 KiB
C++

/*###############################################################################
#
# Copyright 2021 NVIDIA Corporation
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
###############################################################################*/
#ifndef __MESH_RENDERER__
#define __MESH_RENDERER__
#include "nvCVImage.h"
#include <string>
#include <vector>
/// Abstract class to provide methods and hide the implementation.
class MeshRenderer {
public:
struct Dispatch {
// We get these procs from the DLL
NvCV_Status (*name)(const char **str);
NvCV_Status (*info)(const char **str);
NvCV_Status (*create)(MeshRenderer **han);
void (*destroy)(MeshRenderer *han);
NvCV_Status (*read)(MeshRenderer *han, const char *modelFile);
NvCV_Status (*init)(MeshRenderer *han, unsigned width, unsigned height, const char *windowName);
NvCV_Status (*setCamera)(MeshRenderer *han, const float locPt[3], const float lookVec[3], const float upVec[3],
float vfov, float near_z, float far_z);
NvCV_Status (*render)(MeshRenderer *han,
const float exprs[53], const float qrot[4], const float trans[3], NvCVImage *result);
Dispatch();
~Dispatch() {}
};
/// Destructor.
void destroy();
/// Get the name of the renderer associated with the given handle.
/// @param[out] str a place to store a pointer to the name of the mesh renderer.
/// @return NVCV_SUCCESS if the specified mesh renderer was successfully instantiated.
NvCV_Status name(const char **str) const;
/// Get information about the renderer.
/// @param[out] str a place to store a pointer to the name of the mesh renderer.
/// @return NVCV_SUCCESS if the specified mesh renderer was successfully instantiated.
NvCV_Status info(const char **str) const;
/// Read the specified mesh model.
/// If another model was already loaded, it will first be unloaded.
/// If a relative path is specified, several places are searched.
/// @param[in] modelFile the name of the file containing the desired mesh model.
/// @return NVCV_SUCCESS if the model was read successfully.
NvCV_Status read(const char *modelFile);
/// Initialize the rendering resources.
/// @param[in] width The desired width of the rendered image.
/// @param[in] height The desired height of the rendered image.
/// @param[in] windowName The name given to the auxiliary window, if the renderer requires one.
/// @return NVCV_SUCCESS if the renderer was successfully initialized.
NvCV_Status init(unsigned width, unsigned height, const char *windowName);
/// Set the viewing parameters.
/// @param[in] locPt the 3D point location of the camera.
/// NULL implies the default location, derived from the rest pose of the model.
/// @param[in] lookVec the 3D vector indicating the direction of view. This does not need to be normalized.
/// NULL implies the default direction, derived from the rest pose of the model.
/// @param[in] upVec the 3D vector pointing up. This does not need to be normalized.
/// NULL implies the default up direction, derived from the rest pose of the model.
/// @param[in] vfov the vertical field of view of the camera. Zero implies an orthographic camera.
/// @param[in] near_z Near z clipping plane. Distance along camera's negative z-axis. If both near_z and far_z are
/// 0.0, the z clipping planes are computed based on the mesh bounding box.
/// @param[in] far_z Far z clipping plane. Distance along camera's negative z-axis. If both near_z and far_z are
/// 0.0, the z clipping planes are computed based on the mesh bounding box.
/// @return NVCV_SUCCESS if the camera was initialized successfully.
NvCV_Status setCamera(const float locPt[3], const float lookVec[3], const float upVec[3], float vfov, float near_z = 0.0f, float far_z = 0.0f);
/// Render the mesh as deformed by the expression signals.
/// @param[in] exprs the expression signals (53 of them).
/// @param[in] qrot the rotation of the model as an xyzw quaternion.
/// @param[in] trans the translation of the model as an xyz vector.
/// @param[out] result the resultant rendered image.
/// @note: This will appear upside-down.
NvCV_Status render(const float exprs[53], const float qrot[4], const float trans[3], NvCVImage *result);
protected:
MeshRenderer() {} ///< Never create a member of this class
~MeshRenderer() {} ///< Instantiations are always subclasses
Dispatch m_dispatch;
};
class MeshRendererBroker {
public:
/// Constructor.
MeshRendererBroker();
/// Destructor.
~MeshRendererBroker();
/// Set the directory to be searched for additional renderers.
/// @param[in] dir the directory to be searched for additional renderers.
/// @return +NVCV_SUCCESS if the operation was successful.
NvCV_Status setRendererDirectory(const char *dir);
/// Return a list of the available mesh renderers.
/// @param[out] list pointer to a place to store the list of available renderers, separated by newlines.
/// @return NVCV_SUCCESS if a list was successfully returned.
NvCV_Status getMeshRendererList(std::vector<std::string>& list);
/// Retrieve the information about the selected renderer.
/// @param[in] renderer the selected renderer.
/// @param[out] info a place to store a pointer to the information about the selected renderer.
/// @return NVCV_SUCCESS if the information was successfully retrieved;
/// NVCV_ERR_FEATURENOTFOUND if the specified renderer was not found.
/// @note This string is ephemeral. If persistency is desired, a copy must be made. The previous pointer is
/// invalidated when this is called repeatedly
NvCV_Status info(const char *renderer, const char **info);
/// Create an instance of the chosen mesh renderer.
/// @param[in] renderer the desired renderer. NULL chooses the default renderer.
/// @param[out] han a place to store a handle to the desired mesh renderer.
/// @return NVCV_SUCCESS if the specified mesh renderer was successfully instantiated.
/// NVCV_ERR_FEATURENOTFOUND if the specified renderer was not found.
NvCV_Status create(const char *renderer, MeshRenderer **han);
/// Add a new renderer to the broker's portfolio.
/// @param disp the renderer's dispatch table.
void addRenderer(MeshRenderer::Dispatch *disp);
private:
class Impl;
Impl *m_impl;
};
#endif // __MESH_RENDERER__