Pyrogenesis  13997
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MikktspaceWrap.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2012 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "precompiled.h"
19 
20 #include <boost/bind.hpp>
21 
22 #include "graphics/Color.h"
23 #include "graphics/LightEnv.h"
24 #include "graphics/Model.h"
25 #include "graphics/ModelDef.h"
26 #include "graphics/ShaderManager.h"
28 
30 
32 
33 
34 
35 MikkTSpace::MikkTSpace(const CModelDefPtr& m, std::vector<float>& v, bool gpuSkinning) : m_Model(m),
36  m_NewVertices(v), m_GpuSkinning(gpuSkinning)
37 {
38  // ensure that m_NewVertices is empty
39  m_NewVertices.clear();
40 
41  // set up SMikkTSpaceInterface struct
49 
50  // set up SMikkTSpaceContext struct
52  m_Context.m_pUserData = (void*)this;
53 }
54 
56 {
58 }
59 
60 
62 {
63  return ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetNumFaces();
64 }
65 
66 
67 int MikkTSpace::getNumVerticesOfFace(const SMikkTSpaceContext* UNUSED(pContext), const int UNUSED(iFace))
68 {
69  return 3;
70 }
71 
72 
74  float fvPosOut[], const int iFace, const int iVert)
75 {
76  SModelFace &face = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetFaces()[iFace];
77  long i = face.m_Verts[iVert];
78  const CVector3D &p = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetVertices()[i].m_Coords;
79 
80  fvPosOut[0] = p.X;
81  fvPosOut[1] = p.Y;
82  fvPosOut[2] = p.Z;
83 }
84 
85 
87  float fvNormOut[], const int iFace, const int iVert)
88 {
89  SModelFace &face = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetFaces()[iFace];
90  long i = face.m_Verts[iVert];
91  const CVector3D &n = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetVertices()[i].m_Norm;
92 
93  fvNormOut[0] = n.X;
94  fvNormOut[1] = n.Y;
95  fvNormOut[2] = n.Z;
96 }
97 
98 
100  float fvTexcOut[], const int iFace, const int iVert)
101 {
102  SModelFace &face = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetFaces()[iFace];
103  long i = face.m_Verts[iVert];
104  SModelVertex &v = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetVertices()[i];
105 
106  // the tangents are calculated according to the 'default' UV set
107  fvTexcOut[0] = v.m_UVs[0];
108  fvTexcOut[1] = 1.0-v.m_UVs[1];
109 }
110 
111 
112 void MikkTSpace::setTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[],
113  const float UNUSED(fvBiTangent)[], const float UNUSED(fMagS), const float UNUSED(fMagT),
114  const tbool bIsOrientationPreserving, const int iFace, const int iVert)
115 {
116  SModelFace &face = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetFaces()[iFace];
117  long i = face.m_Verts[iVert];
118 
119  SModelVertex* vertices = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetVertices();
120  size_t numUVsPerVertex = ((MikkTSpace*)pContext->m_pUserData)->m_Model->GetNumUVsPerVertex();
121  std::vector<float>& m_NewVertices = ((MikkTSpace*)pContext->m_pUserData)->m_NewVertices;
122 
123  const CVector3D &p = vertices[i].m_Coords;
124  const CVector3D &n = vertices[i].m_Norm;
125 
126  m_NewVertices.push_back(p.X);
127  m_NewVertices.push_back(p.Y);
128  m_NewVertices.push_back(p.Z);
129 
130  m_NewVertices.push_back(n.X);
131  m_NewVertices.push_back(n.Y);
132  m_NewVertices.push_back(n.Z);
133 
134  m_NewVertices.push_back(fvTangent[0]);
135  m_NewVertices.push_back(fvTangent[1]);
136  m_NewVertices.push_back(fvTangent[2]);
137  m_NewVertices.push_back(bIsOrientationPreserving > 0.5 ? 1.0f : (-1.0f));
138 
139  if (((MikkTSpace*)pContext->m_pUserData)->m_GpuSkinning)
140  {
141  for (size_t j = 0; j < 4; ++j)
142  {
143  m_NewVertices.push_back(vertices[i].m_Blend.m_Bone[j]);
144  m_NewVertices.push_back(255.f * vertices[i].m_Blend.m_Weight[j]);
145  }
146  }
147 
148  for (size_t UVset = 0; UVset < numUVsPerVertex; ++UVset)
149  {
150  m_NewVertices.push_back(vertices[i].m_UVs[UVset * 2]);
151  m_NewVertices.push_back(1.0 - vertices[i].m_UVs[UVset * 2 + 1]);
152  }
153 }
154 
155 
156 
static void setTSpace(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT, const tbool bIsOrientationPreserving, const int iFace, const int iVert)
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
CVector3D m_Norm
Definition: ModelDef.h:106
SMikkTSpaceInterface * m_pInterface
Definition: mikktspace.h:109
static int getNumFaces(const SMikkTSpaceContext *pContext)
int(* m_getNumVerticesOfFace)(const SMikkTSpaceContext *pContext, const int iFace)
Definition: mikktspace.h:72
void(* m_setTSpace)(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT, const tbool bIsOrientationPreserving, const int iFace, const int iVert)
Definition: mikktspace.h:103
std::vector< float > & m_NewVertices
void(* m_getNormal)(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert)
Definition: mikktspace.h:77
u16 m_Verts[3]
Definition: ModelDef.h:119
float X
Definition: Vector3D.h:31
float Y
Definition: Vector3D.h:31
SMikkTSpaceContext m_Context
static void getTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert)
int(* m_getNumFaces)(const SMikkTSpaceContext *pContext)
Definition: mikktspace.h:68
static void getNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert)
tbool genTangSpaceDefault(const SMikkTSpaceContext *pContext)
Definition: mikktspace.cpp:249
void(* m_setTSpaceBasic)(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert)
Definition: mikktspace.h:90
static void getPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert)
void(* m_getPosition)(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert)
Definition: mikktspace.h:76
CVector3D m_Coords
Definition: ModelDef.h:104
MikkTSpace(const CModelDefPtr &m, std::vector< float > &v, bool gpuSkinning)
void(* m_getTexCoord)(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert)
Definition: mikktspace.h:78
float Z
Definition: Vector3D.h:31
int tbool
Copyright (C) 2011 by Morten S.
Definition: mikktspace.h:62
static int getNumVerticesOfFace(const SMikkTSpaceContext *pContext, const int iFace)
SMikkTSpaceInterface m_Interface
boost::shared_ptr< CModelDef > CModelDefPtr
Definition: MeshManager.h:27
std::vector< float > m_UVs
Definition: ModelDef.h:108