Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/renderer/MikktspaceWrap.cpp
Show All 38 Lines | MikkTSpace::MikkTSpace(const CModelDefPtr& m, std::vector<float>& v, bool gpuSkinning) : m_Model(m), | ||||
m_Context.m_pUserData = static_cast<void*>(this); | m_Context.m_pUserData = static_cast<void*>(this); | ||||
} | } | ||||
void MikkTSpace::Generate() | void MikkTSpace::Generate() | ||||
{ | { | ||||
genTangSpaceDefault(&m_Context); | genTangSpaceDefault(&m_Context); | ||||
} | } | ||||
int MikkTSpace::GetNumFaces(const SMikkTSpaceContext *pContext) | int MikkTSpace::GetNumFaces(const SMikkTSpaceContext* pContext) | ||||
{ | { | ||||
return GetUserDataFromContext(pContext)->m_Model->GetNumFaces(); | return GetUserDataFromContext(pContext)->m_Model->GetNumFaces(); | ||||
} | } | ||||
int MikkTSpace::GetNumVerticesOfFace(const SMikkTSpaceContext* UNUSED(pContext), const int UNUSED(iFace)) | int MikkTSpace::GetNumVerticesOfFace(const SMikkTSpaceContext* UNUSED(pContext), const int UNUSED(iFace)) | ||||
{ | { | ||||
return 3; | return 3; | ||||
} | } | ||||
void MikkTSpace::GetPosition(const SMikkTSpaceContext *pContext, | void MikkTSpace::GetPosition(const SMikkTSpaceContext* pContext, | ||||
float fvPosOut[3], const int iFace, const int iVert) | float* fvPosOut, const int iFace, const int iVert) | ||||
{ | { | ||||
const CVector3D& position = GetVertex(pContext, iFace, iVert).m_Coords; | const CVector3D& position = GetVertex(pContext, iFace, iVert).m_Coords; | ||||
fvPosOut[0] = position.X; | fvPosOut[0] = position.X; | ||||
fvPosOut[1] = position.Y; | fvPosOut[1] = position.Y; | ||||
fvPosOut[2] = position.Z; | fvPosOut[2] = position.Z; | ||||
} | } | ||||
void MikkTSpace::GetNormal(const SMikkTSpaceContext *pContext, | void MikkTSpace::GetNormal(const SMikkTSpaceContext* pContext, | ||||
float fvNormOut[3], const int iFace, const int iVert) | float* fvNormOut, const int iFace, const int iVert) | ||||
{ | { | ||||
const CVector3D& normal = GetVertex(pContext, iFace, iVert).m_Norm; | const CVector3D& normal = GetVertex(pContext, iFace, iVert).m_Norm; | ||||
fvNormOut[0] = normal.X; | fvNormOut[0] = normal.X; | ||||
fvNormOut[1] = normal.Y; | fvNormOut[1] = normal.Y; | ||||
fvNormOut[2] = normal.Z; | fvNormOut[2] = normal.Z; | ||||
} | } | ||||
void MikkTSpace::GetTexCoord(const SMikkTSpaceContext *pContext, | void MikkTSpace::GetTexCoord(const SMikkTSpaceContext* pContext, | ||||
float fvTexcOut[2], const int iFace, const int iVert) | float* fvTexcOut, const int iFace, const int iVert) | ||||
{ | { | ||||
const MikkTSpace* userData = GetUserDataFromContext(pContext); | const MikkTSpace* userData = GetUserDataFromContext(pContext); | ||||
const SModelFace& face = userData->m_Model->GetFaces()[iFace]; | const SModelFace& face = userData->m_Model->GetFaces()[iFace]; | ||||
const SModelVertex& v = userData->m_Model->GetVertices()[face.m_Verts[iVert]]; | const SModelVertex& v = userData->m_Model->GetVertices()[face.m_Verts[iVert]]; | ||||
// The tangents are calculated according to the 'default' UV set | // The tangents are calculated according to the 'default' UV set | ||||
fvTexcOut[0] = v.m_UVs[0]; | fvTexcOut[0] = v.m_UVs[0]; | ||||
fvTexcOut[1] = 1.0 - v.m_UVs[1]; | fvTexcOut[1] = 1.0 - v.m_UVs[1]; | ||||
} | } | ||||
void MikkTSpace::SetTSpace(const SMikkTSpaceContext* pContext, const float fvTangent[], | void MikkTSpace::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) | ||||
{ | { | ||||
const MikkTSpace* userData = GetUserDataFromContext(pContext); | const MikkTSpace* userData = GetUserDataFromContext(pContext); | ||||
const SModelFace& face = userData->m_Model->GetFaces()[iFace]; | const SModelFace& face = userData->m_Model->GetFaces()[iFace]; | ||||
const SModelVertex& vertex = userData->m_Model->GetVertices()[face.m_Verts[iVert]]; | const SModelVertex& vertex = userData->m_Model->GetVertices()[face.m_Verts[iVert]]; | ||||
const CVector3D &p = vertex.m_Coords; | const CVector3D& p = vertex.m_Coords; | ||||
userData->m_NewVertices.push_back(p.X); | userData->m_NewVertices.push_back(p.X); | ||||
userData->m_NewVertices.push_back(p.Y); | userData->m_NewVertices.push_back(p.Y); | ||||
userData->m_NewVertices.push_back(p.Z); | userData->m_NewVertices.push_back(p.Z); | ||||
const CVector3D& n = vertex.m_Norm; | const CVector3D& n = vertex.m_Norm; | ||||
userData->m_NewVertices.push_back(n.X); | userData->m_NewVertices.push_back(n.X); | ||||
userData->m_NewVertices.push_back(n.Y); | userData->m_NewVertices.push_back(n.Y); | ||||
userData->m_NewVertices.push_back(n.Z); | userData->m_NewVertices.push_back(n.Z); | ||||
Show All 15 Lines | void MikkTSpace::SetTSpace(const SMikkTSpaceContext* pContext, const float* fvTangent, | ||||
size_t numUVsPerVertex = userData->m_Model->GetNumUVsPerVertex(); | size_t numUVsPerVertex = userData->m_Model->GetNumUVsPerVertex(); | ||||
for (size_t UVset = 0; UVset < numUVsPerVertex; ++UVset) | for (size_t UVset = 0; UVset < numUVsPerVertex; ++UVset) | ||||
{ | { | ||||
userData->m_NewVertices.push_back(vertex.m_UVs[UVset * 2]); | userData->m_NewVertices.push_back(vertex.m_UVs[UVset * 2]); | ||||
userData->m_NewVertices.push_back(1.f - vertex.m_UVs[UVset * 2 + 1]); | userData->m_NewVertices.push_back(1.f - vertex.m_UVs[UVset * 2 + 1]); | ||||
} | } | ||||
} | } | ||||
MikkTSpace* MikkTSpace::GetUserDataFromContext(const SMikkTSpaceContext *pContext) | MikkTSpace* MikkTSpace::GetUserDataFromContext(const SMikkTSpaceContext* pContext) | ||||
{ | { | ||||
return static_cast<MikkTSpace*>(pContext->m_pUserData); | return static_cast<MikkTSpace*>(pContext->m_pUserData); | ||||
} | } | ||||
SModelVertex MikkTSpace::GetVertex(const SMikkTSpaceContext *pContext, const int iFace, const int iVert) | SModelVertex MikkTSpace::GetVertex(const SMikkTSpaceContext* pContext, const int iFace, const int iVert) | ||||
{ | { | ||||
const MikkTSpace* userData = GetUserDataFromContext(pContext); | const MikkTSpace* userData = GetUserDataFromContext(pContext); | ||||
const SModelFace& f = userData->m_Model->GetFaces()[iFace]; | const SModelFace& f = userData->m_Model->GetFaces()[iFace]; | ||||
return userData->m_Model->GetVertices()[f.m_Verts[iVert]]; | return userData->m_Model->GetVertices()[f.m_Verts[iVert]]; | ||||
} | } |
Wildfire Games · Phabricator