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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user