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);
|
m_pSoundManager->load(name.c_str(), extension, data);
|
||||||
} else if(extension.compare("obj") == 0) {
|
} else if(extension.compare("obj") == 0) {
|
||||||
KRResource::LoadObj(*this, file_name);
|
KRResource::LoadObj(*this, file_name);
|
||||||
#if TARGET_OS_MAC
|
#if !TARGET_OS_IPHONE
|
||||||
} else if(extension.compare("fbx") == 0) {
|
} else if(extension.compare("fbx") == 0) {
|
||||||
KRResource::LoadFbx(*this, file_name);
|
KRResource::LoadFbx(*this, file_name);
|
||||||
} else if(extension.compare("blend") == 0) {
|
} 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);
|
m_fdPackFile = open(path.c_str(), O_RDONLY);
|
||||||
if(m_fdPackFile >= 0) {
|
if(m_fdPackFile >= 0) {
|
||||||
if(fstat(m_fdPackFile, &statbuf) >= 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 {
|
} else {
|
||||||
m_data_size = statbuf.st_size;
|
m_data_size = statbuf.st_size;
|
||||||
success = true;
|
success = true;
|
||||||
|
|||||||
@@ -264,17 +264,19 @@ void KRMesh::renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const st
|
|||||||
|
|
||||||
|
|
||||||
__uint16_t *index_data = getIndexData();
|
__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) {
|
while(cVertexes > 0) {
|
||||||
|
|
||||||
int start_index_offset, start_vertex_offset, index_count, vertex_count;
|
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);
|
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);
|
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 {
|
} 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
|
// 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<__uint16_t> vertex_indexes;
|
||||||
std::vector<std::pair<int, int> > vertex_index_bases;
|
std::vector<std::pair<int, int> > vertex_index_bases;
|
||||||
|
int vertex_index_offset = 0;
|
||||||
|
|
||||||
std::vector<KRVector3> vertices;
|
std::vector<KRVector3> vertices;
|
||||||
std::vector<KRVector2> uva;
|
std::vector<KRVector2> uva;
|
||||||
@@ -949,13 +952,14 @@ void KRMesh::convertToIndexed()
|
|||||||
material_names.push_back(getSubmesh(submesh_index)->szName);
|
material_names.push_back(getSubmesh(submesh_index)->szName);
|
||||||
|
|
||||||
int vertexes_remaining = getVertexCount(submesh_index);
|
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);
|
submesh_lengths.push_back(vertexes_remaining);
|
||||||
int source_index = getSubmesh(submesh_index)->start_vertex;
|
int source_index = getSubmesh(submesh_index)->start_vertex;
|
||||||
|
|
||||||
|
|
||||||
while(vertexes_remaining) {
|
while(vertexes_remaining) {
|
||||||
vertex_index_bases.push_back(std::pair<int, int>(vertex_indexes.size(), vertices.size()));
|
vertex_index_bases.push_back(std::pair<int, int>(vertex_indexes.size(), vertices.size()));
|
||||||
|
vertex_index_offset = 0;
|
||||||
|
|
||||||
|
|
||||||
int vertex_count = vertexes_remaining;
|
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();
|
pack_header *h = getHeader();
|
||||||
int index_group = getSubmesh(submesh)->start_vertex + submesh_index_group;
|
|
||||||
__uint32_t *index_base_data = getIndexBaseData();
|
__uint32_t *index_base_data = getIndexBaseData();
|
||||||
start_index_offset = index_base_data[index_group * 2];
|
start_index_offset = index_base_data[index_group * 2];
|
||||||
start_vertex_offset = index_base_data[index_group * 2 + 1];
|
start_vertex_offset = index_base_data[index_group * 2 + 1];
|
||||||
@@ -1104,13 +1107,14 @@ int KRMesh::getTriangleVertexIndex(int submesh, int index) const
|
|||||||
switch(getModelFormat()) {
|
switch(getModelFormat()) {
|
||||||
case KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES:
|
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;
|
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) {
|
while(remaining_vertices >= index_count) {
|
||||||
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;
|
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++) {
|
for(int submesh_index=0; submesh_index < header->submesh_count; submesh_index++) {
|
||||||
pack_material *submesh = getSubmesh(submesh_index);
|
pack_material *submesh = getSubmesh(submesh_index);
|
||||||
int vertexes_remaining = submesh->vertex_count;
|
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) {
|
while(vertexes_remaining > 0) {
|
||||||
int start_index_offset, start_vertex_offset, index_count, vertex_count;
|
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;
|
start_index_offset += index_group_offset;
|
||||||
unsigned char * vertex_data_start = vertex_data + start_vertex_offset * m_vertex_size;
|
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 ----====----
|
// ----====---- 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
|
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;
|
} VertexData;
|
||||||
|
|
||||||
typedef struct {
|
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;
|
int32_t vertex_count;
|
||||||
char szName[KRENGINE_MAX_NAME_LENGTH];
|
char szName[KRENGINE_MAX_NAME_LENGTH];
|
||||||
} pack_material;
|
} pack_material;
|
||||||
@@ -235,7 +241,7 @@ private:
|
|||||||
pack_bone *getBone(int index);
|
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
|
// Emissive Color
|
||||||
//lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Emissive;
|
//lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Emissive;
|
||||||
|
|
||||||
|
/*
|
||||||
// Transparency
|
// Transparency
|
||||||
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->TransparencyFactor;
|
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->TransparencyFactor;
|
||||||
new_material->setTransparency(1.0f - lKFbxDouble1.Get());
|
new_material->setTransparency(1.0f - lKFbxDouble1.Get());
|
||||||
|
*/
|
||||||
|
|
||||||
// Shininess
|
// Shininess
|
||||||
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->Shininess;
|
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->Shininess;
|
||||||
new_material->setShininess(lKFbxDouble1.Get());
|
new_material->setShininess(lKFbxDouble1.Get());
|
||||||
|
|
||||||
|
/*
|
||||||
// Specular Factor
|
// Specular Factor
|
||||||
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->SpecularFactor;
|
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->SpecularFactor;
|
||||||
double specular_factor = lKFbxDouble1.Get();
|
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
|
// Reflection factor
|
||||||
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->ReflectionFactor;
|
lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->ReflectionFactor;
|
||||||
@@ -910,10 +918,16 @@ void LoadMaterial(KRContext &context, FbxSurfaceMaterial *pMaterial) {
|
|||||||
|
|
||||||
// Emissive
|
// Emissive
|
||||||
//lKFbxDouble3 =((KFbxSurfaceLambert *)pMaterial)->Emissive;
|
//lKFbxDouble3 =((KFbxSurfaceLambert *)pMaterial)->Emissive;
|
||||||
|
/*
|
||||||
// Opacity
|
// Opacity
|
||||||
lKFbxDouble1 =((KFbxSurfaceLambert *)pMaterial)->TransparencyFactor;
|
lKFbxDouble1 =((KFbxSurfaceLambert *)pMaterial)->TransparencyFactor;
|
||||||
new_material->setTransparency(1.0f - lKFbxDouble1.Get());
|
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 {
|
} else {
|
||||||
printf("Error! Unable to convert material: %s", pMaterial->GetName());
|
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);
|
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 void LoadFbx(KRContext &context, const std::string& path);
|
||||||
static std::vector<KRResource *> LoadBlenderScene(KRContext &context, const std::string& path);
|
static std::vector<KRResource *> LoadBlenderScene(KRContext &context, const std::string& path);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user