Fixed bug in FBX import toolchain that caused incorrect transparency values to be set on materials.

Optimization for packing of index data into VBO's in progress.
This commit is contained in:
2013-05-06 19:33:51 -07:00
parent 9e605863ea
commit e42eeb5392
6 changed files with 50 additions and 21 deletions

View File

@@ -204,7 +204,7 @@ void KRContext::loadResource(const std::string &file_name, KRDataBlock *data) {
m_pSoundManager->load(name.c_str(), extension, data);
} else if(extension.compare("obj") == 0) {
KRResource::LoadObj(*this, file_name);
#if TARGET_OS_MAC
#if !TARGET_OS_IPHONE
} else if(extension.compare("fbx") == 0) {
KRResource::LoadFbx(*this, file_name);
} else if(extension.compare("blend") == 0) {

View File

@@ -79,7 +79,7 @@ bool KRDataBlock::load(const std::string &path)
m_fdPackFile = open(path.c_str(), O_RDONLY);
if(m_fdPackFile >= 0) {
if(fstat(m_fdPackFile, &statbuf) >= 0) {
if ((m_data = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, m_fdPackFile, 0)) == (caddr_t) -1) {
if ((m_data = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, m_fdPackFile, 0)) == (caddr_t) -1) {
} else {
m_data_size = statbuf.st_size;
success = true;

View File

@@ -264,17 +264,19 @@ void KRMesh::renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const st
__uint16_t *index_data = getIndexData();
int submesh_index_group = 0;
int index_group = getSubmesh(iSubmesh)->index_group;
int index_group_offset = getSubmesh(iSubmesh)->index_group_offset;
while(cVertexes > 0) {
int start_index_offset, start_vertex_offset, index_count, vertex_count;
getIndexedRange(iSubmesh, submesh_index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
getIndexedRange(index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
m_pContext->getModelManager()->bindVBO((unsigned char *)pVertexData + start_vertex_offset * m_vertex_size, m_vertex_size * vertex_count, index_data + start_index_offset, index_count * 4, has_vertex_attribute(KRENGINE_ATTRIB_VERTEX), has_vertex_attribute(KRENGINE_ATTRIB_NORMAL), has_vertex_attribute(KRENGINE_ATTRIB_TANGENT), has_vertex_attribute(KRENGINE_ATTRIB_TEXUVA), has_vertex_attribute(KRENGINE_ATTRIB_TEXUVB), has_vertex_attribute(KRENGINE_ATTRIB_BONEINDEXES), has_vertex_attribute(KRENGINE_ATTRIB_BONEWEIGHTS), true);
glDrawElements(GL_TRIANGLES, index_count, GL_UNSIGNED_SHORT, 0);
glDrawElements(GL_TRIANGLES, index_count - index_group_offset, GL_UNSIGNED_SHORT, (void *)(index_group_offset * m_vertex_size));
m_pContext->getModelManager()->log_draw_call(renderPass, object_name, material_name, index_count);
cVertexes -= index_count;
cVertexes -= index_count - index_group_offset;
index_group_offset = 0;
}
} else {
@@ -927,6 +929,7 @@ void KRMesh::convertToIndexed()
// Convert model to indexed vertices, identying vertexes with identical attributes and optimizing order of trianges for best usage post-vertex-transform cache on GPU
std::vector<__uint16_t> vertex_indexes;
std::vector<std::pair<int, int> > vertex_index_bases;
int vertex_index_offset = 0;
std::vector<KRVector3> vertices;
std::vector<KRVector2> uva;
@@ -949,13 +952,14 @@ void KRMesh::convertToIndexed()
material_names.push_back(getSubmesh(submesh_index)->szName);
int vertexes_remaining = getVertexCount(submesh_index);
submesh_starts.push_back(vertex_index_bases.size());
submesh_starts.push_back(vertex_index_bases.size() + (vertex_index_offset << 16));
submesh_lengths.push_back(vertexes_remaining);
int source_index = getSubmesh(submesh_index)->start_vertex;
while(vertexes_remaining) {
vertex_index_bases.push_back(std::pair<int, int>(vertex_indexes.size(), vertices.size()));
vertex_index_offset = 0;
int vertex_count = vertexes_remaining;
@@ -1084,9 +1088,8 @@ void KRMesh::optimize()
}
}
void KRMesh::getIndexedRange(int submesh, int submesh_index_group, int &start_index_offset, int &start_vertex_offset, int &index_count, int &vertex_count) const {
void KRMesh::getIndexedRange(int index_group, int &start_index_offset, int &start_vertex_offset, int &index_count, int &vertex_count) const {
pack_header *h = getHeader();
int index_group = getSubmesh(submesh)->start_vertex + submesh_index_group;
__uint32_t *index_base_data = getIndexBaseData();
start_index_offset = index_base_data[index_group * 2];
start_vertex_offset = index_base_data[index_group * 2 + 1];
@@ -1104,13 +1107,14 @@ int KRMesh::getTriangleVertexIndex(int submesh, int index) const
switch(getModelFormat()) {
case KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES:
{
int remaining_vertices = index;
int submesh_index_group = 0;
int start_index_offset, start_vertex_offset, index_count, vertex_count;
getIndexedRange(submesh, submesh_index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
int index_group = getSubmesh(submesh)->index_group;
int index_group_offset = getSubmesh(submesh)->index_group_offset;
int remaining_vertices = index_group_offset + index;
getIndexedRange(index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
while(remaining_vertices >= index_count) {
remaining_vertices -= index_count;
getIndexedRange(submesh, submesh_index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
getIndexedRange(index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
}
return getIndexData()[start_index_offset + remaining_vertices] + start_vertex_offset;
}
@@ -1139,13 +1143,18 @@ void KRMesh::optimizeIndexes()
for(int submesh_index=0; submesh_index < header->submesh_count; submesh_index++) {
pack_material *submesh = getSubmesh(submesh_index);
int vertexes_remaining = submesh->vertex_count;
int submesh_index_group = 0;
int index_group = getSubmesh(submesh_index)->index_group;
int index_group_offset = getSubmesh(submesh_index)->index_group_offset;
while(vertexes_remaining > 0) {
int start_index_offset, start_vertex_offset, index_count, vertex_count;
getIndexedRange(submesh_index, submesh_index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
getIndexedRange(index_group++, start_index_offset, start_vertex_offset, index_count, vertex_count);
__uint16_t *index_data_start = index_data + start_index_offset;
unsigned char * vertex_data_start = vertex_data + start_vertex_offset * m_vertex_size;
start_index_offset += index_group_offset;
index_count -= index_group_offset;
index_group_offset = 0;
__uint16_t *index_data_start = index_data + start_index_offset + index_group_offset;
unsigned char * vertex_data_start = vertex_data + start_vertex_offset;
// ----====---- Step 1: Optimize triangle drawing order to maximize use of the GPU's post-transform vertex cache ----====----
Forsyth::OptimizeFaces(index_data_start, index_count, vertex_count, new_indices, 16); // FINDME, TODO - GPU post-transform vertex cache size of 16 should be configureable

View File

@@ -133,7 +133,13 @@ public:
} VertexData;
typedef struct {
int32_t start_vertex;
union {
struct { // For Indexed triangles / strips
int16_t index_group;
int16_t index_group_offset;
};
int32_t start_vertex; // For non-indexed trigangles / strips
};
int32_t vertex_count;
char szName[KRENGINE_MAX_NAME_LENGTH];
} pack_material;
@@ -235,7 +241,7 @@ private:
pack_bone *getBone(int index);
void getIndexedRange(int submesh, int submesh_index_group, int &start_index_offset, int &start_vertex_offset, int &index_count, int &vertex_count) const;
void getIndexedRange(int index_group, int &start_index_offset, int &start_vertex_offset, int &index_count, int &vertex_count) const;
};

View File

@@ -876,17 +876,25 @@ void LoadMaterial(KRContext &context, FbxSurfaceMaterial *pMaterial) {
// Emissive Color
//lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Emissive;
/*
// Transparency
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->TransparencyFactor;
new_material->setTransparency(1.0f - lKFbxDouble1.Get());
*/
// Shininess
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->Shininess;
new_material->setShininess(lKFbxDouble1.Get());
/*
// Specular Factor
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->SpecularFactor;
double specular_factor = lKFbxDouble1.Get();
*/
// Transparency Color
lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->TransparentColor;
new_material->setTransparency( 1.0f - (lKFbxDouble3.Get()[0] + lKFbxDouble3.Get()[1] + lKFbxDouble3.Get()[2]) / 3.0f);
// Reflection factor
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->ReflectionFactor;
@@ -910,10 +918,16 @@ void LoadMaterial(KRContext &context, FbxSurfaceMaterial *pMaterial) {
// Emissive
//lKFbxDouble3 =((KFbxSurfaceLambert *)pMaterial)->Emissive;
/*
// Opacity
lKFbxDouble1 =((KFbxSurfaceLambert *)pMaterial)->TransparencyFactor;
new_material->setTransparency(1.0f - lKFbxDouble1.Get());
*/
// Transparency Color
lKFbxDouble3 =((KFbxSurfaceLambert *) pMaterial)->TransparentColor;
new_material->setTransparency(1.0f - (lKFbxDouble3.Get()[0] + lKFbxDouble3.Get()[1] + lKFbxDouble3.Get()[2]) / 3.0f);
} else {
printf("Error! Unable to convert material: %s", pMaterial->GetName());
}

View File

@@ -29,7 +29,7 @@ public:
static std::vector<KRResource *> LoadObj(KRContext &context, const std::string& path);
#if TARGET_OS_MAC
#if !TARGET_OS_IPHONE
static void LoadFbx(KRContext &context, const std::string& path);
static std::vector<KRResource *> LoadBlenderScene(KRContext &context, const std::string& path);
#endif