FBX File Import - Materials and texture map names now imported
--HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%4021
This commit is contained in:
@@ -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 */,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -30,8 +30,14 @@
|
||||
//
|
||||
|
||||
#include "KRMaterial.h"
|
||||
#include "KRTextureManager.h"
|
||||
#include <sys/mman.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,10 @@ KRMesh::~KRMesh() {
|
||||
clearData();
|
||||
}
|
||||
|
||||
std::string KRMesh::getExtension() {
|
||||
return "krobject";
|
||||
}
|
||||
|
||||
void KRMesh::clearData() {
|
||||
clearBuffers();
|
||||
if(m_fdPackFile) {
|
||||
|
||||
@@ -57,15 +57,16 @@ using std::list;
|
||||
using std::vector;
|
||||
|
||||
class KRMesh : public KRResource {
|
||||
public:
|
||||
static vector<KRMesh> 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<KRVector3> vertices, std::vector<KRVector2> uva, std::vector<KRVector3> normals, std::vector<KRVector3> tangents, std::vector<int> submesh_starts, std::vector<int> submesh_lengths, std::vector<std::string> material_names);
|
||||
void loadPack(std::string path);
|
||||
virtual bool save(const std::string& path);
|
||||
|
||||
|
||||
void renderSubmesh(int iSubmesh, int *iPrevBuffer);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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<KRResource *> &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<KRResource *> &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 <KFbxTexture> (pProperty.GetSrcObject(KFbxTexture::ClassId,0));
|
||||
KFbxFileTexture *pFileTexture = KFbxCast<KFbxFileTexture>(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 <KFbxTexture> (pProperty.GetSrcObject(KFbxTexture::ClassId,0));
|
||||
KFbxFileTexture *pFileTexture = KFbxCast<KFbxFileTexture>(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 <KFbxTexture> (pProperty.GetSrcObject(KFbxTexture::ClassId,0));
|
||||
KFbxFileTexture *pFileTexture = KFbxCast<KFbxFileTexture>(pTexture);
|
||||
if(pFileTexture) {
|
||||
new_material->setNormalMap(KRResource::GetFileBase(pFileTexture->GetFileName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool bFound = false;
|
||||
vector<KRResource *>::iterator resource_itr = resources.begin();
|
||||
for(vector<KRResource *>::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<KRResource *> &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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<KRInstance *> m_instances;
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user