diff --git a/KREngine/KREngine.xcodeproj/project.pbxproj b/KREngine/KREngine.xcodeproj/project.pbxproj index 15b44c9..0ebff4c 100644 --- a/KREngine/KREngine.xcodeproj/project.pbxproj +++ b/KREngine/KREngine.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ E497B95D151BF05F00D3DC67 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E497B95C151BF05F00D3DC67 /* CoreServices.framework */; }; E497B95F151BF09600D3DC67 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E497B95E151BF09600D3DC67 /* SystemConfiguration.framework */; }; E49E79FF1512615F009CF99C /* KRMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49E79FE1512615F009CF99C /* KRMesh.cpp */; }; + E4B2A4391523B027004CB0EC /* KRMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = E491017D13C99BDC0098455B /* KRMaterial.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4B2A43B1523B02E004CB0EC /* KRMaterial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E491017C13C99BDC0098455B /* KRMaterial.cpp */; }; E4BBBB8A1512A40300F43B5B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E4BBBB881512A40300F43B5B /* InfoPlist.strings */; }; E4BBBB8E1512A40300F43B5B /* krengine_osx.m in Sources */ = {isa = PBXBuildFile; fileRef = E4BBBB8D1512A40300F43B5B /* krengine_osx.m */; }; E4BBBB9C1512A4A900F43B5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4BBBB9A1512A48200F43B5B /* Foundation.framework */; }; @@ -347,6 +349,7 @@ E497B948151BB89D00D3DC67 /* KRVector2.h in Headers */, E4D0683F1512A790005FFBEB /* KRVector3.h in Headers */, E497B94B151BCEE900D3DC67 /* KRResource.h in Headers */, + E4B2A4391523B027004CB0EC /* KRMaterial.h in Headers */, E46DBE811512AFE600D59F86 /* KRMesh.h in Headers */, E46DBE851512B9FA00D59F86 /* KREngine-common.h in Headers */, ); @@ -462,6 +465,7 @@ files = ( E46DBE7B1512ACE600D59F86 /* KRMesh.cpp in Sources */, E4BBBBA71512A6DC00F43B5B /* KRVector3.cpp in Sources */, + E4B2A43B1523B02E004CB0EC /* KRMaterial.cpp in Sources */, E4BBBB8E1512A40300F43B5B /* krengine_osx.m in Sources */, E497B947151BA99500D3DC67 /* KRVector2.cpp in Sources */, E497B94E151BCF2500D3DC67 /* KRResource.cpp in Sources */, diff --git a/KREngine/KREngine/Classes/KREngine.mm b/KREngine/KREngine/Classes/KREngine.mm index a313d54..9b2f44b 100644 --- a/KREngine/KREngine/Classes/KREngine.mm +++ b/KREngine/KREngine/Classes/KREngine.mm @@ -329,7 +329,7 @@ double const PI = 3.141592653589793f; KRVector3 cameraPosition; KRVector3 lightDirection; KRBoundingVolume shadowVolume = KRBoundingVolume(vertices); - pScene->render(&m_camera, shadowVolume, m_pMaterialManager, true, shadowmvpmatrix[iShadow], cameraPosition, lightDirection, shadowmvpmatrix, NULL, 0); + pScene->render(&m_camera, shadowVolume, m_pMaterialManager, true, shadowmvpmatrix[iShadow], cameraPosition, lightDirection, shadowmvpmatrix, NULL, 0, m_pShaderManager, m_pTextureManager); glViewport(0, 0, 768, 1024); } @@ -355,7 +355,7 @@ double const PI = 3.141592653589793f; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); KRBoundingVolume frustrumVolume = KRBoundingVolume(viewMatrix, m_camera.perspective_fov, m_camera.perspective_aspect, m_camera.perspective_nearz, m_camera.perspective_farz); - pScene -> render(&m_camera, frustrumVolume, m_pMaterialManager, false, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers); + pScene -> render(&m_camera, frustrumVolume, m_pMaterialManager, false, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, m_pShaderManager, m_pTextureManager); } - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file withOptions: (NSString *)options diff --git a/KREngine/KREngine/Classes/KRInstance.cpp b/KREngine/KREngine/Classes/KRInstance.cpp index 336a530..6a5cf1a 100644 --- a/KREngine/KREngine/Classes/KRInstance.cpp +++ b/KREngine/KREngine/Classes/KRInstance.cpp @@ -48,7 +48,7 @@ KRModel *KRInstance::getModel() { return m_pModel; } -void KRInstance::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers) { +void KRInstance::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager) { KRMat4 projectionMatrix; if(!bRenderShadowMap) { @@ -62,7 +62,7 @@ void KRInstance::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, KRVector3 cameraPosObject = inverseModelMatrix.dot(cameraPosition); KRVector3 lightDirObject = inverseModelMatrix.dot(lightDirection); - m_pModel->render(pCamera, pMaterialManager, bRenderShadowMap, mvpmatrix, cameraPosObject, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers); + m_pModel->render(pCamera, pMaterialManager, bRenderShadowMap, mvpmatrix, cameraPosObject, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, pShaderManager, pTextureManager); } diff --git a/KREngine/KREngine/Classes/KRInstance.h b/KREngine/KREngine/Classes/KRInstance.h index 05a7c50..4fe43b4 100644 --- a/KREngine/KREngine/Classes/KRInstance.h +++ b/KREngine/KREngine/Classes/KRInstance.h @@ -48,7 +48,7 @@ class KRInstance { public: KRInstance(KRModel *pModel, const KRMat4 modelMatrix); ~KRInstance(); - void render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers); + void render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager); KRBoundingVolume getExtents(); diff --git a/KREngine/KREngine/Classes/KRMaterial.cpp b/KREngine/KREngine/Classes/KRMaterial.cpp index dcb2986..e810595 100644 --- a/KREngine/KREngine/Classes/KRMaterial.cpp +++ b/KREngine/KREngine/Classes/KRMaterial.cpp @@ -30,8 +30,14 @@ // #include "KRMaterial.h" +#include "KRTextureManager.h" +#include +#include +#include +#include +#include -KRMaterial::KRMaterial(char *szName, KRShaderManager *pShaderManager) { +KRMaterial::KRMaterial(const char *szName) : KRResource(szName) { strcpy(m_szName, szName); m_pAmbientMap = NULL; m_pDiffuseMap = NULL; @@ -48,28 +54,62 @@ KRMaterial::KRMaterial(char *szName, KRShaderManager *pShaderManager) { m_ks_b = (GLfloat)1.0f; m_tr = (GLfloat)0.0f; m_ns = (GLfloat)0.0f; - - m_pShaderManager = pShaderManager; + m_ambientMap = ""; + m_diffuseMap = ""; + m_specularMap = ""; + m_normalMap = ""; } KRMaterial::~KRMaterial() { } -void KRMaterial::setAmbientMap(KRTexture *pTexture) { - m_pAmbientMap = pTexture; +std::string KRMaterial::getExtension() { + return "mtl"; +} +bool KRMaterial::save(const std::string& path) { + FILE *f = fopen(path.c_str(), "w+"); + if(f == NULL) { + return false; + } else { + + fprintf(f, "newmtl %s\n", m_szName); + fprintf(f, "ka %f %f %f\n", m_ka_r, m_ka_g, m_ka_b); + fprintf(f, "kd %f %f %f\n", m_kd_r, m_kd_g, m_kd_b); + fprintf(f, "ks %f %f %f\n", m_ks_r, m_ks_g, m_ks_b); + fprintf(f, "Tr %f\n", m_tr); + fprintf(f, "Ns %f\n", m_ns); + if(m_ambientMap.size()) { + fprintf(f, "map_Ka %s.pvr\n", m_ambientMap.c_str()); + } + if(m_diffuseMap.size()) { + fprintf(f, "map_Kd %s.pvr\n", m_diffuseMap.c_str()); + } + if(m_specularMap.size()) { + fprintf(f, "map_Ks %s.pvr\n", m_specularMap.c_str()); + } + if(m_normalMap.size()) { + fprintf(f, "map_Normal %s.pvr\n", m_normalMap.c_str()); + } + fclose(f); + return true; + } } -void KRMaterial::setDiffuseMap(KRTexture *pTexture) { - m_pDiffuseMap = pTexture; +void KRMaterial::setAmbientMap(std::string texture_name) { + m_ambientMap = texture_name; } -void KRMaterial::setSpecularMap(KRTexture *pTexture) { - m_pSpecularMap = pTexture; +void KRMaterial::setDiffuseMap(std::string texture_name) { + m_diffuseMap = texture_name; } -void KRMaterial::setNormalMap(KRTexture *pTexture) { - m_pNormalMap = pTexture; +void KRMaterial::setSpecularMap(std::string texture_name) { + m_specularMap = texture_name; +} + +void KRMaterial::setNormalMap(std::string texture_name) { + m_normalMap = texture_name; } void KRMaterial::setAmbient(GLfloat r, GLfloat g, GLfloat b) { @@ -101,16 +141,29 @@ void KRMaterial::setShininess(GLfloat s) { bool KRMaterial::isTransparent() { return m_tr != 0.0; } - -void KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers) { +#if TARGET_OS_IPHONE +void KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager) { bool bSameMaterial = *prevBoundMaterial == this; + if(!m_pAmbientMap && m_ambientMap.size()) { + m_pAmbientMap = pTextureManager->getTexture(m_ambientMap.c_str()); + } + if(!m_pDiffuseMap && m_diffuseMap.size()) { + m_pDiffuseMap = pTextureManager->getTexture(m_diffuseMap.c_str()); + } + if(!m_pNormalMap && m_normalMap.size()) { + m_pNormalMap = pTextureManager->getTexture(m_normalMap.c_str()); + } + if(!m_pSpecularMap && m_specularMap.size()) { + m_pSpecularMap = pTextureManager->getTexture(m_specularMap.c_str()); + } + bool bDiffuseMap = m_pDiffuseMap != NULL && pCamera->bEnableDiffuseMap; bool bNormalMap = m_pNormalMap != NULL && pCamera->bEnableNormalMap; bool bSpecMap = m_pSpecularMap != NULL && pCamera->bEnableSpecMap; if(!bSameMaterial) { - KRShader *pShader = m_pShaderManager->getShader(pCamera, bDiffuseMap, bNormalMap, bSpecMap, cShadowBuffers); + KRShader *pShader = pShaderManager->getShader(pCamera, bDiffuseMap, bNormalMap, bSpecMap, cShadowBuffers); bool bSameShader = strcmp(pShader->getKey(), szPrevShaderKey) == 0; if(!bSameShader) { @@ -203,6 +256,7 @@ void KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRC *prevBoundMaterial = this; } // if(!bSameMaterial) } +#endif char *KRMaterial::getName() { return m_szName; diff --git a/KREngine/KREngine/Classes/KRMaterial.h b/KREngine/KREngine/Classes/KRMaterial.h index 26cd886..d83bac1 100644 --- a/KREngine/KREngine/Classes/KRMaterial.h +++ b/KREngine/KREngine/Classes/KRMaterial.h @@ -44,26 +44,38 @@ using std::list; #import "KRShaderManager.h" #import "KRShader.h" #import "KRCamera.h" +#import "KRResource.h" -class KRMaterial { +class KRTextureManager; + +class KRMaterial : public KRResource { public: - KRMaterial(char *szName, KRShaderManager *pShaderManager); + KRMaterial(const char *szName); ~KRMaterial(); - void setAmbientMap(KRTexture *pTexture); - void setDiffuseMap(KRTexture *pTexture); - void setSpecularMap(KRTexture *pTexture); - void setNormalMap(KRTexture *pTexture); + virtual std::string getExtension(); + virtual bool save(const std::string& path); + + + void setAmbientMap(std::string texture_name); + void setDiffuseMap(std::string texture_name); + void setSpecularMap(std::string texture_name); + void setNormalMap(std::string texture_name); void setAmbient(GLfloat r, GLfloat g, GLfloat b); void setDiffuse(GLfloat r, GLfloat g, GLfloat b); void setSpecular(GLfloat r, GLfloat g, GLfloat b); void setTransparency(GLfloat a); void setShininess(GLfloat s); - void bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers); + bool isTransparent(); char *getName(); +#if TARGET_OS_IPHONE + void bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager); + +#endif + private: char m_szName[64]; @@ -71,6 +83,10 @@ private: KRTexture *m_pDiffuseMap; // mtl map_Kd value KRTexture *m_pSpecularMap; // mtl map_Ks value KRTexture *m_pNormalMap; // mtl map_Normal value + std::string m_ambientMap; + std::string m_diffuseMap; + std::string m_specularMap; + std::string m_normalMap; GLfloat m_ka_r, m_ka_g, m_ka_b; // Ambient rgb GLfloat m_kd_r, m_kd_g, m_kd_b; // Diffuse rgb @@ -78,8 +94,6 @@ private: GLfloat m_tr; // Transparency GLfloat m_ns; // Shininess - - KRShaderManager *m_pShaderManager; }; #endif diff --git a/KREngine/KREngine/Classes/KRMaterialManager.cpp b/KREngine/KREngine/Classes/KRMaterialManager.cpp index e3beb8d..474237a 100644 --- a/KREngine/KREngine/Classes/KRMaterialManager.cpp +++ b/KREngine/KREngine/Classes/KRMaterialManager.cpp @@ -110,7 +110,7 @@ bool KRMaterialManager::loadFile(const char *szPath) { if(strcmp(szSymbol[0], "newmtl") == 0 && cSymbols >= 2) { - pMaterial = new KRMaterial(szSymbol[1], m_pShaderManager); + pMaterial = new KRMaterial(szSymbol[1]); m_materials[szSymbol[1]] = pMaterial; } if(pMaterial != NULL) { if(strcmp(szSymbol[0], "Ka") == 0) { @@ -171,18 +171,18 @@ bool KRMaterialManager::loadFile(const char *szPath) { *pLastPeriod = '\0'; } - KRTexture *pTexture = m_pTextureManager->getTexture(szSymbol[1]); - if(pTexture) { - if(strcmp(szSymbol[0], "map_Ka") == 0) { - pMaterial->setAmbientMap(pTexture); - } else if(strcmp(szSymbol[0], "map_Kd") == 0) { - pMaterial->setDiffuseMap(pTexture); - } else if(strcmp(szSymbol[0], "map_Ks") == 0) { - pMaterial->setSpecularMap(pTexture); - } else if(strcmp(szSymbol[0], "map_Normal") == 0) { - pMaterial->setNormalMap(pTexture); - } + + + if(strcmp(szSymbol[0], "map_Ka") == 0) { + pMaterial->setAmbientMap(szSymbol[1]); + } else if(strcmp(szSymbol[0], "map_Kd") == 0) { + pMaterial->setDiffuseMap(szSymbol[1]); + } else if(strcmp(szSymbol[0], "map_Ks") == 0) { + pMaterial->setSpecularMap(szSymbol[1]); + } else if(strcmp(szSymbol[0], "map_Normal") == 0) { + pMaterial->setNormalMap(szSymbol[1]); } + } } diff --git a/KREngine/KREngine/Classes/KRMesh.cpp b/KREngine/KREngine/Classes/KRMesh.cpp index b5206dc..10752e5 100644 --- a/KREngine/KREngine/Classes/KRMesh.cpp +++ b/KREngine/KREngine/Classes/KRMesh.cpp @@ -52,6 +52,10 @@ KRMesh::~KRMesh() { clearData(); } +std::string KRMesh::getExtension() { + return "krobject"; +} + void KRMesh::clearData() { clearBuffers(); if(m_fdPackFile) { diff --git a/KREngine/KREngine/Classes/KRMesh.h b/KREngine/KREngine/Classes/KRMesh.h index 3c5e35a..8deb486 100644 --- a/KREngine/KREngine/Classes/KRMesh.h +++ b/KREngine/KREngine/Classes/KRMesh.h @@ -57,15 +57,16 @@ using std::list; using std::vector; class KRMesh : public KRResource { -public: - static vector loadObj(const char *szPath); - +public: KRMesh(std::string name); ~KRMesh(); + virtual std::string getExtension(); + virtual bool save(const std::string& path); + void LoadData(std::vector vertices, std::vector uva, std::vector normals, std::vector tangents, std::vector submesh_starts, std::vector submesh_lengths, std::vector material_names); void loadPack(std::string path); - virtual bool save(const std::string& path); + void renderSubmesh(int iSubmesh, int *iPrevBuffer); diff --git a/KREngine/KREngine/Classes/KRModel.cpp b/KREngine/KREngine/Classes/KRModel.cpp index 4bc73b2..14b17b6 100644 --- a/KREngine/KREngine/Classes/KRModel.cpp +++ b/KREngine/KREngine/Classes/KRModel.cpp @@ -43,6 +43,7 @@ #include "KRVector3.h" #import "KRShader.h" +#import "KRShaderManager.h" KRModel::KRModel(std::string path, KRMaterialManager *pMaterialManager) { @@ -66,7 +67,7 @@ KRModel::~KRModel() { } -void KRModel::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers) { +void KRModel::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager) { KRMaterial *pPrevBoundMaterial = NULL; int iPrevBuffer = -1; char szPrevShaderKey[128]; @@ -92,7 +93,7 @@ void KRModel::render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, boo KRMaterial *pMaterial = m_materials[iSubmesh]; if(pMaterial != NULL && pMaterial == (*mat_itr)) { - pMaterial->bind(&pPrevBoundMaterial, szPrevShaderKey, pCamera, mvpMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers); + pMaterial->bind(&pPrevBoundMaterial, szPrevShaderKey, pCamera, mvpMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, pShaderManager, pTextureManager); m_pMesh->renderSubmesh(iSubmesh, &iPrevBuffer); } } diff --git a/KREngine/KREngine/Classes/KRModel.h b/KREngine/KREngine/Classes/KRModel.h index 0143e50..3b16353 100644 --- a/KREngine/KREngine/Classes/KRModel.h +++ b/KREngine/KREngine/Classes/KRModel.h @@ -52,7 +52,7 @@ public: KRModel(std::string path, KRMaterialManager *pMaterialManager); ~KRModel(); - void render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers); + void render(KRCamera *pCamera, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &mvpMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager); KRMesh *getMesh(); diff --git a/KREngine/KREngine/Classes/KRResource+fbx.cpp b/KREngine/KREngine/Classes/KRResource+fbx.cpp index b66cf59..20ef275 100644 --- a/KREngine/KREngine/Classes/KRResource+fbx.cpp +++ b/KREngine/KREngine/Classes/KRResource+fbx.cpp @@ -23,6 +23,7 @@ #include "KRResource.h" #include "KRMesh.h" +#include "KRMaterial.h" #ifdef IOS_REF #undef IOS_REF @@ -297,6 +298,7 @@ void LoadMesh(std::vector &resources, KFbxGeometryConverter *pGeom int dest_vertex_id = 0; for(int iMaterial=0; iMaterial < material_count; iMaterial++) { + KFbxSurfaceMaterial *pMaterial = pNode->GetMaterial(iMaterial); int source_vertex_id = 0; int mat_vertex_count = 0; int mat_vertex_start = dest_vertex_id; @@ -448,12 +450,137 @@ void LoadMesh(std::vector &resources, KFbxGeometryConverter *pGeom } } - // ----====---- Output last material / submesh details ----====---- + if(mat_vertex_count) { + // ----====---- Output last material / submesh details ----====---- submesh_starts.push_back(mat_vertex_start); submesh_lengths.push_back(mat_vertex_count); - material_names.push_back(pNode->GetMaterial(iMaterial)->GetName()); - printf(" %s: %i - %i\n", pNode->GetMaterial(iMaterial)->GetName(), mat_vertex_start, mat_vertex_count + mat_vertex_start - 1); + material_names.push_back(pMaterial->GetName()); + printf(" %s: %i - %i\n", pMaterial->GetName(), mat_vertex_start, mat_vertex_count + mat_vertex_start - 1); + + // ----====---- Output Material File ----====---- + KRMaterial *new_material = new KRMaterial(pMaterial->GetName()); + + KFbxPropertyDouble3 lKFbxDouble3; + KFbxPropertyDouble1 lKFbxDouble1; + + if (pMaterial->GetClassId().Is(KFbxSurfacePhong::ClassId)) { + // We found a Phong material. + + // Ambient Color + lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Ambient; + new_material->setAmbient(lKFbxDouble3.Get()[0], lKFbxDouble3.Get()[1], lKFbxDouble3.Get()[2]); + + // Diffuse Color + lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Diffuse; + new_material->setDiffuse(lKFbxDouble3.Get()[0], lKFbxDouble3.Get()[1], lKFbxDouble3.Get()[2]); + + // Specular Color (unique to Phong materials) + lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Specular; + new_material->setSpecular(lKFbxDouble3.Get()[0], lKFbxDouble3.Get()[1], lKFbxDouble3.Get()[2]); + + // Emissive Color + //lKFbxDouble3 =((KFbxSurfacePhong *) pMaterial)->Emissive; + + // Transparency + lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->TransparencyFactor; + new_material->setTransparency(1.0-lKFbxDouble1.Get()); + + // Shininess + lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->Shininess; + new_material->setShininess(lKFbxDouble1.Get()); + + // Display the Reflectivity + //lKFbxDouble1 =((KFbxSurfacePhong *) pMaterial)->ReflectionFactor; + } else if(pMaterial->GetClassId().Is(KFbxSurfaceLambert::ClassId) ) { + // We found a Lambert material. + + // Ambient Color + lKFbxDouble3=((KFbxSurfaceLambert *)pMaterial)->Ambient; + new_material->setAmbient(lKFbxDouble3.Get()[0], lKFbxDouble3.Get()[1], lKFbxDouble3.Get()[2]); + + // Diffuse Color + lKFbxDouble3 =((KFbxSurfaceLambert *)pMaterial)->Diffuse; + new_material->setDiffuse(lKFbxDouble3.Get()[0], lKFbxDouble3.Get()[1], lKFbxDouble3.Get()[2]); + + // Emissive + //lKFbxDouble3 =((KFbxSurfaceLambert *)pMaterial)->Emissive; + + // Opacity + lKFbxDouble1 =((KFbxSurfaceLambert *)pMaterial)->TransparencyFactor; + new_material->setTransparency(1.0-lKFbxDouble1.Get()); + } else { + printf("Error! Unable to convert material: %s", pMaterial->GetName()); + } + + + + KFbxProperty pProperty; + + // Diffuse Map Texture + pProperty = pMaterial->FindProperty(KFbxSurfaceMaterial::sDiffuse); + if(pProperty.GetSrcObjectCount(KFbxLayeredTexture::ClassId) > 0) { + printf("Error! Layered textures not supported.\n"); + } else { + int texture_count = pProperty.GetSrcObjectCount(KFbxTexture::ClassId); + if(texture_count > 1) { + printf("Error! Multiple diffuse textures not supported.\n"); + } else if(texture_count == 1) { + KFbxTexture* pTexture = KFbxCast (pProperty.GetSrcObject(KFbxTexture::ClassId,0)); + KFbxFileTexture *pFileTexture = KFbxCast(pTexture); + if(pFileTexture) { + new_material->setDiffuseMap(KRResource::GetFileBase(pFileTexture->GetFileName())); + } + } + } + + // Specular Map Texture + pProperty = pMaterial->FindProperty(KFbxSurfaceMaterial::sSpecular); + if(pProperty.GetSrcObjectCount(KFbxLayeredTexture::ClassId) > 0) { + printf("Error! Layered textures not supported.\n"); + } else { + int texture_count = pProperty.GetSrcObjectCount(KFbxTexture::ClassId); + if(texture_count > 1) { + printf("Error! Multiple specular textures not supported.\n"); + } else if(texture_count == 1) { + KFbxTexture* pTexture = KFbxCast (pProperty.GetSrcObject(KFbxTexture::ClassId,0)); + KFbxFileTexture *pFileTexture = KFbxCast(pTexture); + if(pFileTexture) { + new_material->setSpecularMap(KRResource::GetFileBase(pFileTexture->GetFileName())); + } + } + } + + // Normal Map Texture + pProperty = pMaterial->FindProperty(KFbxSurfaceMaterial::sNormalMap); + if(pProperty.GetSrcObjectCount(KFbxLayeredTexture::ClassId) > 0) { + printf("Error! Layered textures not supported.\n"); + } else { + int texture_count = pProperty.GetSrcObjectCount(KFbxTexture::ClassId); + if(texture_count > 1) { + printf("Error! Multiple normal map textures not supported.\n"); + } else if(texture_count == 1) { + KFbxTexture* pTexture = KFbxCast (pProperty.GetSrcObject(KFbxTexture::ClassId,0)); + KFbxFileTexture *pFileTexture = KFbxCast(pTexture); + if(pFileTexture) { + new_material->setNormalMap(KRResource::GetFileBase(pFileTexture->GetFileName())); + } + } + } + + bool bFound = false; + vector::iterator resource_itr = resources.begin(); + for(vector::iterator resource_itr = resources.begin(); resource_itr != resources.end(); resource_itr++) { + KRResource *pResource = (*resource_itr); + if(pResource->getName() == new_material->getName() && pResource->getExtension() == new_material->getExtension()) { + bFound = true; + } + } + if(bFound) { + delete new_material; + } else { + resources.push_back(new_material); + } } } @@ -465,5 +592,6 @@ void LoadMesh(std::vector &resources, KFbxGeometryConverter *pGeom KRMesh *new_mesh = new KRMesh(pNode->GetName()); new_mesh->LoadData(vertices, uva, normals, tangents, submesh_starts, submesh_lengths, material_names); resources.push_back(new_mesh); + } diff --git a/KREngine/KREngine/Classes/KRResource.h b/KREngine/KREngine/Classes/KRResource.h index b4da35a..46bff2a 100644 --- a/KREngine/KREngine/Classes/KRResource.h +++ b/KREngine/KREngine/Classes/KRResource.h @@ -20,6 +20,7 @@ class KRResource { public: std::string getName(); + virtual std::string getExtension() = 0; static std::string GetFileExtension(const std::string& name); static std::string GetFileBase(const std::string& name); diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index 76c80b8..ce2ff3f 100644 --- a/KREngine/KREngine/Classes/KRScene.cpp +++ b/KREngine/KREngine/Classes/KRScene.cpp @@ -52,7 +52,7 @@ KRInstance *KRScene::addInstance(KRModel *pModel, KRMat4 modelMatrix) { m_instances.push_back(pInstance); return pInstance; } -void KRScene::render(KRCamera *pCamera, KRBoundingVolume &frustrumVolume, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers) { +void KRScene::render(KRCamera *pCamera, KRBoundingVolume &frustrumVolume, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager) { if(cShadowBuffers > 0 && !bRenderShadowMap) { glActiveTexture(GL_TEXTURE3); @@ -86,7 +86,7 @@ void KRScene::render(KRCamera *pCamera, KRBoundingVolume &frustrumVolume, KRMate KRInstance *pInstance = *itr; if(pInstance->getExtents().test_intersect(frustrumVolume) || bRenderShadowMap) { - pInstance->render(pCamera, pMaterialManager, bRenderShadowMap, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers); + pInstance->render(pCamera, pMaterialManager, bRenderShadowMap, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, pShaderManager, pTextureManager); } } } diff --git a/KREngine/KREngine/Classes/KRScene.h b/KREngine/KREngine/Classes/KRScene.h index 49b9cd3..bd8cbf2 100644 --- a/KREngine/KREngine/Classes/KRScene.h +++ b/KREngine/KREngine/Classes/KRScene.h @@ -51,7 +51,7 @@ public: KRScene(); ~KRScene(); KRInstance *addInstance(KRModel *pModel, KRMat4 modelMatrix); - void render(KRCamera *pCamera, KRBoundingVolume &frustrumVolume, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers); + void render(KRCamera *pCamera, KRBoundingVolume &frustrumVolume, KRMaterialManager *pMaterialManager, bool bRenderShadowMap, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRShaderManager *pShaderManager, KRTextureManager *pTextureManager); KRBoundingVolume getExtents(); private: vector m_instances; diff --git a/objpack/objpack/KROBJPacker.cpp b/objpack/objpack/KROBJPacker.cpp index a315457..0c3337c 100644 --- a/objpack/objpack/KROBJPacker.cpp +++ b/objpack/objpack/KROBJPacker.cpp @@ -66,7 +66,8 @@ void KROBJPacker::pack(const char *szPath) { out_file_name.append("/output/"); //out_file_name.append(pResource->GetFileBase(pResource->getName())); out_file_name.append(pResource->getName()); - out_file_name.append(".krobject"); + out_file_name.append("."); + out_file_name.append(pResource->getExtension()); std::cout << "Writing " << out_file_name << " ... "; if(pResource->save(out_file_name)) { std::cout << " SUCCESS!\n";