Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/renderer/MikktspaceWrap.h
Show All 12 Lines | |||||
* | * | ||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | ||||
*/ | */ | ||||
#ifndef INCLUDED_MIKKWRAP | #ifndef INCLUDED_MIKKWRAP | ||||
#define INCLUDED_MIKKWRAP | #define INCLUDED_MIKKWRAP | ||||
#include "graphics/Model.h" | #include "graphics/MeshManager.h" | ||||
#include "graphics/ModelDef.h" | #include "graphics/ModelDef.h" | ||||
#include "third_party/mikktspace/mikktspace.h" | #include "third_party/mikktspace/mikktspace.h" | ||||
#include <vector> | #include <vector> | ||||
class CVector3D; | class CVector3D; | ||||
class MikkTSpace | class MikkTSpace | ||||
{ | { | ||||
public: | public: | ||||
MikkTSpace(const CModelDefPtr& m, std::vector<float>& v, bool gpuSkinning); | MikkTSpace(const CModelDefPtr& m, std::vector<float>& v, bool gpuSkinning); | ||||
void Generate(); | void Generate(); | ||||
private: | private: | ||||
SMikkTSpaceInterface m_Interface; | SMikkTSpaceInterface m_Interface; | ||||
SMikkTSpaceContext m_Context; | SMikkTSpaceContext m_Context; | ||||
const CModelDefPtr& m_Model; | const CModelDefPtr& m_Model; | ||||
std::vector<float>& m_NewVertices; | std::vector<float>& m_NewVertices; | ||||
bool m_GpuSkinning; | bool m_GpuSkinning; | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @returns - the number of faces (triangles/quads) on the mesh to be processed. | * @returns - the number of faces (triangles/quads) on the mesh to be processed. | ||||
*/ | */ | ||||
static int GetNumFaces(const SMikkTSpaceContext *pContext); | static int GetNumFaces(const SMikkTSpaceContext* pContext); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | * @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | ||||
* @returns - the number of faces (triangles/quads) on the mesh to be processed. | * @returns - the number of faces (triangles/quads) on the mesh to be processed. | ||||
*/ | */ | ||||
static int GetNumVerticesOfFace(const SMikkTSpaceContext *pContext, const int iFace); | static int GetNumVerticesOfFace(const SMikkTSpaceContext* pContext, const int iFace); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @returns - The MikkTSpace. | * @returns - The MikkTSpace. | ||||
*/ | */ | ||||
static MikkTSpace* GetUserDataFromContext(const SMikkTSpaceContext *pContext); | static MikkTSpace* GetUserDataFromContext(const SMikkTSpaceContext* pContext); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | * @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | ||||
* @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | * @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | ||||
* @returns - The MikkTSpace. | * @returns - The MikkTSpace. | ||||
*/ | */ | ||||
static SModelVertex GetVertex(const SMikkTSpaceContext *pContext, const int iFace, const int iVert); | static SModelVertex GetVertex(const SMikkTSpaceContext* pContext, const int iFace, const int iVert); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[out] fvPosOut - The array containing the face. | * @param[out] fvPosOut - The array containing the face. | ||||
* @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | * @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | ||||
* @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | * @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | ||||
*/ | */ | ||||
static void GetPosition(const SMikkTSpaceContext *pContext, | static void GetPosition(const SMikkTSpaceContext* pContext, | ||||
float fvPosOut[3], const int iFace, const int iVert); | float* fvPosOut, const int iFace, const int iVert); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[out] fvNormOut iVert - The array containing the normal. | * @param[out] fvNormOut iVert - The array containing the normal. | ||||
* @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | * @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | ||||
* @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | * @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | ||||
*/ | */ | ||||
static void GetNormal(const SMikkTSpaceContext *pContext, | static void GetNormal(const SMikkTSpaceContext* pContext, | ||||
float fvNormOut[3], const int iFace, const int iVert); | float* fvNormOut, const int iFace, const int iVert); | ||||
/** | /** | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[out] fvTexcOut iVert - Array containing the UV. | * @param[out] fvTexcOut iVert - Array containing the UV. | ||||
* @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | * @param[in] iFace - Number in the range { 0, 1, ..., getNumFaces() - 1 }. | ||||
* @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | * @param[in] iVert - Number in the range { 0, 1, 2 } for triangles and { 0, 1, 2, 3 } for quads. | ||||
*/ | */ | ||||
static void GetTexCoord(const SMikkTSpaceContext *pContext, | static void GetTexCoord(const SMikkTSpaceContext* pContext, | ||||
float fvTexcOut[2], const int iFace, const int iVert); | float* fvTexcOut, const int iFace, const int iVert); | ||||
/** | /** | ||||
* @brief This function is used to return tangent space results to the application. | * @brief This function is used to return tangent space results to the application. | ||||
* For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level. | * For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level. | ||||
* fSign = bIsOrientationPreserving ? 1.0f : (-1.0f); | * fSign = bIsOrientationPreserving ? 1.0f : (-1.0f); | ||||
* bitangent = fSign * cross(vN, tangent); | * bitangent = fSign * cross(vN, tangent); | ||||
* @param[in] pContext - Pointer to the MikkTSpace context. | * @param[in] pContext - Pointer to the MikkTSpace context. | ||||
* @param[in] fvTangent - fvTangent - The tangent vector. | * @param[in] fvTangent - fvTangent - The tangent vector. | ||||
* @param[in] fvBiTangent - The "real" bitangent vector. Not be perpendicular to fvTangent. However, both are perpendicular to the vertex normal. | * @param[in] fvBiTangent - The "real" bitangent vector. Not be perpendicular to fvTangent. However, both are perpendicular to the vertex normal. | ||||
* @param[in] fMagS - magniture of the fvTangent vector. | * @param[in] fMagS - magniture of the fvTangent vector. | ||||
* @param[in] fMagT - magniture of the fvBiTangent vector. | * @param[in] fMagT - magniture of the fvBiTangent vector. | ||||
* @param[in] bIsOrientationPreserving - Whether the orientation should be preserved. | * @param[in] bIsOrientationPreserving - Whether the orientation should be preserved. | ||||
* @param[in] iFace - Number in the range {0,1,2} for triangles and {0,1,2,3} for quads. | * @param[in] iFace - Number in the range {0,1,2} for triangles and {0,1,2,3} for quads. | ||||
* @param[in] iVert - Array containing the position vector of the face. | * @param[in] iVert - Array containing the position vector of the face. | ||||
*/ | */ | ||||
static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], | static void SetTSpace(const SMikkTSpaceContext* pContext, const float* fvTangent, | ||||
const float UNUSED(fvBiTangent)[], const float UNUSED(fMagS), const float UNUSED(fMagT), | const float* UNUSED(fvBiTangent), const float UNUSED(fMagS), const float UNUSED(fMagT), | ||||
const tbool bIsOrientationPreserving, const int iFace, const int iVert); | const tbool bIsOrientationPreserving, const int iFace, const int iVert); | ||||
}; | }; | ||||
#endif // INCLUDED_MIKKWRAP | #endif // INCLUDED_MIKKWRAP |
Wildfire Games · Phabricator