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); 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_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, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + 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_TEXUVA, 2, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + sizeof(KRVector3D) * 2)); glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVB, 2, GL_FLOAT, 0, data_size, BUFFER_OFFSET(sizeof(KRVector3D) * 3 + sizeof(TexCoord)));
glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVB, 2, GL_FLOAT, 0, sizeof(VertexData), BUFFER_OFFSET(sizeof(Vertex3D) + sizeof(KRVector3D) * 2 + sizeof(TexCoord)));
*iPrevBuffer = iBuffer; *iPrevBuffer = iBuffer;
} }

View File

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

View File

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

View File

@@ -331,60 +331,250 @@ void LoadMesh(std::vector<KRResource *> &resources, KFbxGeometryConverter *pGeom
KFbxVector4 v = control_points[lControlPointIndex]; KFbxVector4 v = control_points[lControlPointIndex];
vertices.push_back(KRVector3(v[0], v[1], v[2])); 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 ----====---- // ----====---- Read UVs ----====----
for (int l = 0; l < uv_count; ++l) // for (int l = 0; l < uv_count; ++l)
{ // {
KFbxVector2 uv; // KFbxVector2 uv;
KFbxGeometryElementUV* leUV = pMesh->GetElementUV(l); // 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: // KFbxLayerElementArrayTemplate<KFbxVector2>* lUVArray = NULL;
switch (leUV->GetReferenceMode()) { // pMesh->GetTextureUV(&lUVArray, KFbxLayerElement::eDIFFUSE_TEXTURES);
case KFbxGeometryElement::eDIRECT: //
uv = leUV->GetDirectArray().GetAt(lControlPointIndex); // 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; break;
case KFbxGeometryElement::eINDEX_TO_DIRECT: case KFbxLayerElement::eINDEX_TO_DIRECT:
{ {
int id = leUV->GetIndexArray().GetAt(lControlPointIndex); int id = uvs->GetIndexArray().GetAt(cpIndex);
uv = leUV->GetDirectArray().GetAt(id); uv = uvs->GetDirectArray().GetAt(id));
} }
break; break;
default: default:
break; // other reference modes not shown here! break; // other reference modes not shown here!
} }
break; break;
case KFbxLayerElement::eBY_POLYGON_VERTEX: //BUG: This wont work in some FBXs, so we will skip the uvs
case KFbxGeometryElement::eBY_POLYGON_VERTEX:
{ {
int lTextureUVIndex = pMesh->GetTextureUVIndex(iPolygon, iVertex); //int id = fbxmesh->GetTextureUVIndex(lPolygonIndex, iVertex);
switch (leUV->GetReferenceMode()) int id = lCurrentPolygonIndex + iVertex;
switch (uvs->GetReferenceMode() )
{ {
case KFbxGeometryElement::eDIRECT: case KFbxLayerElement::eDIRECT:
case KFbxGeometryElement::eINDEX_TO_DIRECT: break;
{ case KFbxLayerElement::eINDEX_TO_DIRECT:
uv = leUV->GetDirectArray().GetAt(lTextureUVIndex); //uvs_index_vector[iLayer] = id;
} id = uvs->GetIndexArray().GetAt(id);
break; break;
default: default:
break; // other reference modes not shown here! break;
} }
Display2DVector(header, uvs->GetDirectArray().GetAt(id));
int numuvs = uvs->GetDirectArray().GetCount();
assert( id < numuvs );
} }
break; 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) { if(iLayer == 0) {
uva.push_back(KRVector2(uv[0], uv[1])); new_uva = KRVector2(uv[0], uv[1]);
} else if(l == 1) { // uva.push_back(KRVector2(uv[0], uv[1]));
uvb.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 ----====---- // ----====---- Read Normals ----====----