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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -106,4 +106,3 @@ KRMesh *KRModel::getMesh() {
|
|||||||
return m_pMesh;
|
return m_pMesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 ----====----
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user