Fixed 2nd UV set import issues. Lightmapping now fully functional

--HG--
extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%4025
This commit is contained in:
kearwood
2012-04-05 20:12:39 +00:00
parent f2845b2456
commit ee3fbb8a8a
4 changed files with 232 additions and 44 deletions

View File

@@ -235,14 +235,13 @@ void KRMesh::renderSubmesh(int iSubmesh, int *iPrevBuffer) {
glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVB);
}
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 3, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(0));
int data_size = sizeof(VertexData);
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_NORMAL, 3, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D)));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TANGENT, 3, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + sizeof(KRVector3D)));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + sizeof(KRVector3D) * 2));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVB, 2, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + sizeof(KRVector3D) * 2 + sizeof(TexCoord)));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 3, GL_FLOAT, 0, data_size, BUFFER_OFFSET(0));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_NORMAL, 3, GL_FLOAT, 0, data_size, BUFFER_OFFSET(sizeof(KRVector3D)));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TANGENT, 3, GL_FLOAT, 0, data_size, BUFFER_OFFSET(sizeof(KRVector3D) * 2));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, data_size, BUFFER_OFFSET(sizeof(KRVector3D) * 3));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVB, 2, GL_FLOAT, 0, data_size, BUFFER_OFFSET(sizeof(KRVector3D) * 3 + sizeof(TexCoord)));
*iPrevBuffer = iBuffer;
}

View File

@@ -88,7 +88,7 @@ public:
GLfloat x;
GLfloat y;
GLfloat z;
} Vertex3D, KRVector3D;
} KRVector3D;
typedef struct {
GLfloat u;
@@ -96,7 +96,7 @@ public:
} TexCoord;
typedef struct {
Vertex3D vertex;
KRVector3D vertex;
KRVector3D normal;
KRVector3D tangent;
TexCoord uva;

View File

@@ -106,4 +106,3 @@ KRMesh *KRModel::getMesh() {
return m_pMesh;
}

View File

@@ -331,60 +331,250 @@ void LoadMesh(std::vector<KRResource *> &resources, KFbxGeometryConverter *pGeom
KFbxVector4 v = control_points[lControlPointIndex];
vertices.push_back(KRVector3(v[0], v[1], v[2]));
KRVector2 new_uva = KRVector2(0.0, 0.0);
KRVector2 new_uvb = KRVector2(0.0, 0.0);
// ----====---- Read UVs ----====----
for (int l = 0; l < uv_count; ++l)
{
KFbxVector2 uv;
KFbxGeometryElementUV* leUV = pMesh->GetElementUV(l);
// for (int l = 0; l < uv_count; ++l)
// {
// KFbxVector2 uv;
// KFbxGeometryElementUV* leUV = pMesh->GetElementUV(l);
//
// switch (leUV->GetMappingMode()) {
// case KFbxGeometryElement::eBY_CONTROL_POINT:
// switch (leUV->GetReferenceMode()) {
// case KFbxGeometryElement::eDIRECT:
// uv = leUV->GetDirectArray().GetAt(lControlPointIndex);
// break;
// case KFbxGeometryElement::eINDEX_TO_DIRECT:
// {
// int id = leUV->GetIndexArray().GetAt(lControlPointIndex);
// uv = leUV->GetDirectArray().GetAt(id);
// }
// break;
// default:
// break; // other reference modes not shown here!
// }
// break;
//
// case KFbxGeometryElement::eBY_POLYGON_VERTEX:
// switch (leUV->GetReferenceMode()) {
// case KFbxGeometryElement::eDIRECT:
// uv = leUV->GetDirectArray().GetAt(source_vertex_id);
// break;
// case KFbxGeometryElement::eINDEX_TO_DIRECT:
// {
// int id = leUV->GetIndexArray().GetAt(source_vertex_id);
// uv = leUV->GetDirectArray().GetAt(id);
// }
// break;
// default:
// break; // other reference modes not shown here!
// }
// break;
//
//
//// case KFbxGeometryElement::eBY_POLYGON_VERTEX:
//// {
//// int lTextureUVIndex = pMesh->GetTextureUVIndex(iPolygon, iVertex);
//// switch (leUV->GetReferenceMode())
//// {
//// case KFbxGeometryElement::eDIRECT:
//// case KFbxGeometryElement::eINDEX_TO_DIRECT:
//// {
//// uv = leUV->GetDirectArray().GetAt(lTextureUVIndex);
//// }
//// break;
//// default:
//// break; // other reference modes not shown here!
//// }
//// }
//// break;
////
//
// case KFbxGeometryElement::eBY_POLYGON: // doesn't make much sense for UVs
// case KFbxGeometryElement::eALL_SAME: // doesn't make much sense for UVs
// case KFbxGeometryElement::eNONE: // doesn't make much sense for UVs
// break;
// }
//
//
//
//
//
// if(l == 0) {
// new_uva = KRVector2(uv[0], uv[1]);
// // uva.push_back(KRVector2(uv[0], uv[1]));
// } else if(l == 1) {
// new_uvb = KRVector2(uv[0], uv[1]);
// // uvb.push_back(KRVector2(uv[0], uv[1]));
// }
// }
//
// if(uv_count > 0) {
// uva.push_back(new_uva);
// }
// if(uv_count > 1) {
// uvb.push_back(new_uvb);
// }
switch (leUV->GetMappingMode()) {
case KFbxGeometryElement::eBY_CONTROL_POINT:
switch (leUV->GetReferenceMode()) {
case KFbxGeometryElement::eDIRECT:
uv = leUV->GetDirectArray().GetAt(lControlPointIndex);
// KFbxLayerElementArrayTemplate<KFbxVector2>* lUVArray = NULL;
// pMesh->GetTextureUV(&lUVArray, KFbxLayerElement::eDIFFUSE_TEXTURES);
//
// int lCurrentUVIndex = pMesh->GetTextureUVIndex(iPolygon, iVertex, KFbxLayerElement::eDIFFUSE_TEXTURES);
//
// KFbxVector2 uv = lUVArray->GetAt(lCurrentUVIndex);
// new_uva = KRVector2(uv[0], uv[1]);
// if(pMesh->GetLayerCount() >= 1) {
// KFbxLayerElementUV* uvs = pMesh->GetLayer(0)->GetUVs();
// KFbxVector2 uv;
// int index = 0;
// switch (uvs->GetMappingMode())
// {
// case KFbxLayerElement::eBY_CONTROL_POINT:
// index = pMesh->GetPolygonVertex(iPolygon, iVertex);
// break;
// case KFbxLayerElement::eBY_POLYGON_VERTEX:
// index = source_vertex_id;
// break;
// case KFbxLayerElement::eBY_POLYGON:
// index = iPolygon;
// break;
// }
//
// if (uvs->GetReferenceMode() != KFbxLayerElement::eDIRECT)
// {
// index = uvs->GetIndexArray().GetAt(index);
// }
//
//
// uv = uvs->GetDirectArray().GetAt(index);
//
// new_uva = KRVector2(uv[0], uv[1]);
// }
//
// if(pMesh->GetLayerCount() >= 2) {
// KFbxLayerElementUV* uvs = pMesh->GetLayer(1)->GetUVs();
// KFbxVector2 uv;
// int index = 0;
// switch (uvs->GetMappingMode())
// {
// case KFbxLayerElement::eBY_CONTROL_POINT:
// index = pMesh->GetPolygonVertex(iPolygon, iVertex);
// break;
// case KFbxLayerElement::eBY_POLYGON_VERTEX:
// index = source_vertex_id;
// break;
// case KFbxLayerElement::eBY_POLYGON:
// index = iPolygon;
// break;
// }
//
// if (uvs->GetReferenceMode() != KFbxLayerElement::eDIRECT)
// {
// index = uvs->GetIndexArray().GetAt(index);
// }
//
//
// uv = uvs->GetDirectArray().GetAt(index);
//
// new_uva = KRVector2(uv[0], uv[1]);
// }
KStringList uvNames;
pMesh->GetUVSetNames(uvNames);
if(uv_count >= 1) {
const char *setName = uvNames[0].Buffer();
KFbxVector2 uv;
if(pMesh->GetPolygonVertexUV(iPolygon, iVertex, setName, uv)) {
new_uva = KRVector2(uv[0], uv[1]);
}
}
if(uv_count >= 2) {
const char *setName = uvNames[1].Buffer();
KFbxVector2 uv;
if(pMesh->GetPolygonVertexUV(iPolygon, iVertex, setName, uv)) {
new_uvb = KRVector2(uv[0], uv[1]);
}
}
/*
for (int iLayer = 0; iLayer < pMesh->GetLayerCount(); iLayer++)
{
KFbxLayerElementUV* uvs = pMesh->GetLayer(iLayer)->GetUVs();
KFbxVector2 uv;
if (uvs == NULL) continue;
switch (uvs->GetMappingMode())
{
case KFbxLayerElement::eBY_CONTROL_POINT:
//uvs_index_vector[iLayer] = cpIndex; break;
switch (uvs->GetReferenceMode())
{
case KFbxLayerElement::eDIRECT:
uv = uvs->GetDirectArray().GetAt(cpIndex));
break;
case KFbxGeometryElement::eINDEX_TO_DIRECT:
case KFbxLayerElement::eINDEX_TO_DIRECT:
{
int id = leUV->GetIndexArray().GetAt(lControlPointIndex);
uv = leUV->GetDirectArray().GetAt(id);
int id = uvs->GetIndexArray().GetAt(cpIndex);
uv = uvs->GetDirectArray().GetAt(id));
}
break;
default:
break; // other reference modes not shown here!
}
break;
case KFbxGeometryElement::eBY_POLYGON_VERTEX:
case KFbxLayerElement::eBY_POLYGON_VERTEX: //BUG: This wont work in some FBXs, so we will skip the uvs
{
int lTextureUVIndex = pMesh->GetTextureUVIndex(iPolygon, iVertex);
switch (leUV->GetReferenceMode())
//int id = fbxmesh->GetTextureUVIndex(lPolygonIndex, iVertex);
int id = lCurrentPolygonIndex + iVertex;
switch (uvs->GetReferenceMode() )
{
case KFbxGeometryElement::eDIRECT:
case KFbxGeometryElement::eINDEX_TO_DIRECT:
{
uv = leUV->GetDirectArray().GetAt(lTextureUVIndex);
}
case KFbxLayerElement::eDIRECT:
break;
case KFbxLayerElement::eINDEX_TO_DIRECT:
//uvs_index_vector[iLayer] = id;
id = uvs->GetIndexArray().GetAt(id);
break;
default:
break; // other reference modes not shown here!
break;
}
Display2DVector(header, uvs->GetDirectArray().GetAt(id));
int numuvs = uvs->GetDirectArray().GetCount();
assert( id < numuvs );
}
break;
case KFbxGeometryElement::eBY_POLYGON: // doesn't make much sense for UVs
case KFbxGeometryElement::eALL_SAME: // doesn't make much sense for UVs
case KFbxGeometryElement::eNONE: // doesn't make much sense for UVs
break;
}
if(l == 0) {
uva.push_back(KRVector2(uv[0], uv[1]));
} else if(l == 1) {
uvb.push_back(KRVector2(uv[0], uv[1]));
if(iLayer == 0) {
new_uva = KRVector2(uv[0], uv[1]);
// uva.push_back(KRVector2(uv[0], uv[1]));
} else if(iLayer == 1) {
new_uvb = KRVector2(uv[0], uv[1]);
// uvb.push_back(KRVector2(uv[0], uv[1]));
}
}
*/
if(uv_count > 0) {
uva.push_back(new_uva);
}
if(uv_count > 1) {
uvb.push_back(new_uvb);
}
// ----====---- Read Normals ----====----