[DEV] add a simple camera view test
This commit is contained in:
parent
13c661d29f
commit
fd643dea6b
@ -376,625 +376,6 @@ void ege::resource::Mesh::createIcoSphere(const std::string& _materialName,float
|
|||||||
calculateNormaleFace(_materialName);
|
calculateNormaleFace(_materialName);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ege::resource::Mesh::loadOBJ(const std::string& _fileName) {
|
|
||||||
m_normalMode = normalModeNone;
|
|
||||||
#if 0
|
|
||||||
etk::FSNode fileName(_fileName);
|
|
||||||
// get the fileSize ...
|
|
||||||
int32_t size = fileName.fileSize();
|
|
||||||
if (size == 0 ) {
|
|
||||||
EGE_ERROR("No data in the file named=\"" << fileName << "\"");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(false == fileName.fileOpenRead() ) {
|
|
||||||
EGE_ERROR("Can not find the file name=\"" << fileName << "\"");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
char inputDataLine[2048];
|
|
||||||
|
|
||||||
int32_t lineID = 0;
|
|
||||||
while (nullptr != fileName.fileGets(inputDataLine, 2048) )
|
|
||||||
{
|
|
||||||
lineID++;
|
|
||||||
if (inputDataLine[0] == 'v') {
|
|
||||||
if (inputDataLine[1] == 'n') {
|
|
||||||
// Vertice normal : vn 0.000000 0.000000 -1.000000
|
|
||||||
// we did not use normal == > we recalculated it if needed (some .obj does not export normal, then it is simple like this ...
|
|
||||||
// TODO : Use the normal provided ... => can be smooth or not ... (cf check "s 1")
|
|
||||||
} else if (inputDataLine[1] == 't') {
|
|
||||||
// Texture position : vt 0.748573 0.750412
|
|
||||||
vec2 vertex(0,0);
|
|
||||||
sscanf(&inputDataLine[3], "%f %f", &vertex.m_floats[0], &vertex.m_floats[1]);
|
|
||||||
m_listUV.push_back(vertex);
|
|
||||||
} else {
|
|
||||||
// Vertice position : v 1.000000 -1.000000 -1.000000
|
|
||||||
vec3 vertex(0,0,0);
|
|
||||||
sscanf(&inputDataLine[2], "%f %f %f", &vertex.m_floats[0], &vertex.m_floats[1], &vertex.m_floats[2] );
|
|
||||||
m_listVertex.push_back(vertex);
|
|
||||||
}
|
|
||||||
} else if (inputDataLine[0] == 'f') {
|
|
||||||
// face : f 5/1/1 1/2/1 4/3/1*
|
|
||||||
uint32_t vertexIndex[4], uvIndex[4], normalIndex[4];
|
|
||||||
bool quadMode = true;
|
|
||||||
int32_t matches = sscanf(&inputDataLine[2], "%d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n",
|
|
||||||
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
|
||||||
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
|
||||||
&vertexIndex[2], &uvIndex[2], &normalIndex[2],
|
|
||||||
&vertexIndex[3], &uvIndex[3], &normalIndex[3] );
|
|
||||||
if (12 != matches){
|
|
||||||
// no normal mode :
|
|
||||||
matches = sscanf(&inputDataLine[2], "%d/%d %d/%d %d/%d %d/%d\n",
|
|
||||||
&vertexIndex[0], &uvIndex[0],
|
|
||||||
&vertexIndex[1], &uvIndex[1],
|
|
||||||
&vertexIndex[2], &uvIndex[2],
|
|
||||||
&vertexIndex[3], &uvIndex[3] );
|
|
||||||
if (8 != matches){
|
|
||||||
quadMode = false;
|
|
||||||
matches = sscanf(&inputDataLine[2], "%d/%d/%d %d/%d/%d %d/%d/%d\n",
|
|
||||||
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
|
||||||
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
|
||||||
&vertexIndex[2], &uvIndex[2], &normalIndex[2] );
|
|
||||||
if (9 != matches){
|
|
||||||
// no normal mode :
|
|
||||||
matches = sscanf(&inputDataLine[2], "%d/%d %d/%d %d/%d\n",
|
|
||||||
&vertexIndex[0], &uvIndex[0],
|
|
||||||
&vertexIndex[1], &uvIndex[1],
|
|
||||||
&vertexIndex[2], &uvIndex[2] );
|
|
||||||
if (6 != matches){
|
|
||||||
EGE_ERROR("Parsing error in the .obj files : " << fileName << " (l=" << lineID << ") in 'f' section : \"" << &inputDataLine[2] << "\" expected : %d/%d(/%d) %d/%d(/%d) %d/%d(/%d) (%d/%d(/%d)) () for option");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (true == quadMode) {
|
|
||||||
m_listFaces.push_back(Face(vertexIndex[0]-1, uvIndex[0]-1,
|
|
||||||
vertexIndex[1]-1, uvIndex[1]-1,
|
|
||||||
vertexIndex[2]-1, uvIndex[2]-1,
|
|
||||||
vertexIndex[3]-1, uvIndex[3]-1));
|
|
||||||
} else {
|
|
||||||
m_listFaces.push_back(Face(vertexIndex[0]-1, uvIndex[0]-1,
|
|
||||||
vertexIndex[1]-1, uvIndex[1]-1,
|
|
||||||
vertexIndex[2]-1, uvIndex[2]-1));
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
EGE_DEBUG(" plop : " << tmpFace.m_nbElement << " ? " << m_listFaces[m_listFaces.size()-1].m_nbElement);
|
|
||||||
EGE_DEBUG(" : " << tmpFace.m_vertex[0] << " ? " << m_listFaces[m_listFaces.size()-1].m_vertex[0]);
|
|
||||||
EGE_DEBUG(" : " << tmpFace.m_uv[0] << " ? " << m_listFaces[m_listFaces.size()-1].m_uv[0]);
|
|
||||||
*/
|
|
||||||
} else if (inputDataLine[0] == 's') {
|
|
||||||
// ??? : s off
|
|
||||||
} else if (inputDataLine[0] == '#') {
|
|
||||||
// comment
|
|
||||||
// nothing to do ... just go to the new line ...
|
|
||||||
} else if( inputDataLine[0] == 'u'
|
|
||||||
&& inputDataLine[1] == 's'
|
|
||||||
&& inputDataLine[2] == 'e'
|
|
||||||
&& inputDataLine[3] == 'm'
|
|
||||||
&& inputDataLine[4] == 't'
|
|
||||||
&& inputDataLine[5] == 'l' ) {
|
|
||||||
// Use Material : usemtl imageName.xxx
|
|
||||||
while( inputDataLine[strlen(inputDataLine)-1] == '\n'
|
|
||||||
|| inputDataLine[strlen(inputDataLine)-1] == '\r'
|
|
||||||
|| inputDataLine[strlen(inputDataLine)-1] == ' ') {
|
|
||||||
if (1 == strlen(inputDataLine) ){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
inputDataLine[strlen(inputDataLine)-1] = '\0';
|
|
||||||
}
|
|
||||||
std::string tmpVal(&inputDataLine[7]);
|
|
||||||
setTexture(fileName.getRelativeFolder() + tmpVal);
|
|
||||||
} else if( inputDataLine[0] == 'm'
|
|
||||||
&& inputDataLine[1] == 't'
|
|
||||||
&& inputDataLine[2] == 'l'
|
|
||||||
&& inputDataLine[3] == 'l'
|
|
||||||
&& inputDataLine[4] == 'i'
|
|
||||||
&& inputDataLine[5] == 'b' ) {
|
|
||||||
// ???? : mtllib cube.mtl
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fileName.fileClose();
|
|
||||||
generateVBO();
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jumpEndLine(etk::FSNode& _file) {
|
|
||||||
char current=_file.fileGet();
|
|
||||||
while( current != '\0'
|
|
||||||
&& current != '\n') {
|
|
||||||
//printf("%c", current);
|
|
||||||
current=_file.fileGet();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t countIndent(etk::FSNode& _file) {
|
|
||||||
int32_t nbIndent=0;
|
|
||||||
int32_t nbSpacesTab=0;
|
|
||||||
int32_t nbChar=0;
|
|
||||||
//EGE_DEBUG(" start count Indent");
|
|
||||||
for(char current=_file.fileGet(); current != '\0'; current=_file.fileGet()) {
|
|
||||||
nbChar++;
|
|
||||||
//EGE_DEBUG("parse : " << current);
|
|
||||||
if (current == '\t') {
|
|
||||||
nbSpacesTab = 0;
|
|
||||||
nbIndent++;
|
|
||||||
} else if (current == ' ') {
|
|
||||||
nbSpacesTab++;
|
|
||||||
if (nbSpacesTab == 4) {
|
|
||||||
nbSpacesTab = 0;
|
|
||||||
nbIndent++;
|
|
||||||
}
|
|
||||||
} else if (current == '#') {
|
|
||||||
// Auto remove comment ...
|
|
||||||
jumpEndLine(_file);
|
|
||||||
return countIndent(_file);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//EGE_DEBUG("indent : " << nbIndent);
|
|
||||||
_file.fileSeek(-nbChar, etk::FSN_SEEK_CURRENT);
|
|
||||||
return nbIndent;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* loadNextData(char* _elementLine,
|
|
||||||
int64_t _maxData,
|
|
||||||
etk::FSNode& _file,
|
|
||||||
bool _removeTabs=false,
|
|
||||||
bool _stopColomn=false,
|
|
||||||
bool _stopPipe=true) {
|
|
||||||
memset(_elementLine, 0, _maxData);
|
|
||||||
char * element = _elementLine;
|
|
||||||
int64_t outSize = 0;
|
|
||||||
/*
|
|
||||||
if (m_zipReadingOffset >= m_zipContent->size()) {
|
|
||||||
element[0] = '\0';
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
char current = _file.fileGet();
|
|
||||||
while (current != '\0') {
|
|
||||||
if( _removeTabs == false
|
|
||||||
|| element != _elementLine) {
|
|
||||||
*element = current;
|
|
||||||
element++;
|
|
||||||
}
|
|
||||||
if( current == '\n'
|
|
||||||
|| current == '\r'
|
|
||||||
|| ( current == '|'
|
|
||||||
&& _stopPipe == true)
|
|
||||||
|| ( current == ':'
|
|
||||||
&& _stopColomn == true) )
|
|
||||||
{
|
|
||||||
*element = '\0';
|
|
||||||
//EGE_DEBUG(" plop : '" << _elementLine << "'" );
|
|
||||||
return _elementLine;
|
|
||||||
} else if( element == _elementLine
|
|
||||||
&& current != '\t') {
|
|
||||||
*element = current;
|
|
||||||
element++;
|
|
||||||
}
|
|
||||||
// check maxData size ...
|
|
||||||
if (outSize >= _maxData-1) {
|
|
||||||
*element = '\0';
|
|
||||||
return _elementLine;
|
|
||||||
}
|
|
||||||
current = _file.fileGet();
|
|
||||||
}
|
|
||||||
if (outSize == 0) {
|
|
||||||
return nullptr;
|
|
||||||
} else {
|
|
||||||
// send last line
|
|
||||||
return _elementLine;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeEndLine(char* _val) {
|
|
||||||
int32_t len = strlen(_val);
|
|
||||||
if( len>0
|
|
||||||
&& ( _val[len-1] == '\n'
|
|
||||||
|| _val[len-1] == '\r' ) ) {
|
|
||||||
_val[len-1] = '\0';
|
|
||||||
}
|
|
||||||
len--;
|
|
||||||
if( len>0
|
|
||||||
&& ( _val[len-1] == '\n'
|
|
||||||
|| _val[len-1] == '\r') ) {
|
|
||||||
_val[len-1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum emfModuleMode {
|
|
||||||
EMFModuleNone,
|
|
||||||
EMFModuleMesh,
|
|
||||||
EMFModuleMeshNamed,
|
|
||||||
EMFModuleMeshVertex,
|
|
||||||
EMFModuleMeshUVMapping,
|
|
||||||
EMFModuleMeshNormalVertex,
|
|
||||||
EMFModuleMeshNormalFace,
|
|
||||||
EMFModuleMeshFace,
|
|
||||||
EMFModuleMeshFaceMaterial,
|
|
||||||
EMFModuleMeshPhysics,
|
|
||||||
EMFModuleMeshPhysicsNamed,
|
|
||||||
EMFModuleMesh_END,
|
|
||||||
EMFModuleMaterial,
|
|
||||||
EMFModuleMaterialNamed,
|
|
||||||
EMFModuleMaterial_END,
|
|
||||||
};
|
|
||||||
// TODO : rework with string line extractor
|
|
||||||
bool ege::resource::Mesh::loadEMF(const std::string& _fileName) {
|
|
||||||
m_checkNormal = true;
|
|
||||||
m_normalMode = normalModeNone;
|
|
||||||
etk::FSNode fileName(_fileName);
|
|
||||||
// get the fileSize ...
|
|
||||||
int32_t size = fileName.fileSize();
|
|
||||||
if (size == 0 ) {
|
|
||||||
EGE_ERROR("No data in the file named=\"" << fileName << "\"");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(false == fileName.fileOpenRead() ) {
|
|
||||||
EGE_ERROR("Can not find the file name=\"" << fileName << "\"");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
char inputDataLine[2048];
|
|
||||||
// load the first line :
|
|
||||||
fileName.fileGets(inputDataLine, 2048);
|
|
||||||
if(0 == strncmp(inputDataLine, "EMF(STRING)", 11)) {
|
|
||||||
// parse in string mode ...
|
|
||||||
} else if (0 == strncmp(inputDataLine, "EMF(BINARY)", 11)) {
|
|
||||||
EGE_ERROR(" file binary mode is not supported now : 'EMF(BINARY)'");
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
EGE_ERROR(" file mode is not supported now : 'EMF(? ? ?)' = '" << inputDataLine << "'");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
enum emfModuleMode currentMode = EMFModuleNone;
|
|
||||||
EGE_VERBOSE("Start parsing Mesh file : " << fileName);
|
|
||||||
// mesh global param :
|
|
||||||
std::string currentMeshName = "";
|
|
||||||
int32_t meshFaceMaterialID = -1;
|
|
||||||
// material global param :
|
|
||||||
std::string materialName = "";
|
|
||||||
std::shared_ptr<ege::Material> material;
|
|
||||||
// physical shape:
|
|
||||||
std::shared_ptr<ege::PhysicsShape> physics;
|
|
||||||
while(1) {
|
|
||||||
int32_t level = countIndent(fileName);
|
|
||||||
if (level == 0) {
|
|
||||||
// new section ...
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(0 == strncmp(inputDataLine, "Mesh :", 6) ) {
|
|
||||||
currentMode = EMFModuleMesh;
|
|
||||||
EGE_VERBOSE("Parse Mesh :");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "Materials : ", 11) ) {
|
|
||||||
currentMode = EMFModuleMaterial;
|
|
||||||
EGE_VERBOSE("Parse Material :");
|
|
||||||
} else {
|
|
||||||
currentMode = EMFModuleNone;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (currentMode >= EMFModuleMesh && currentMode <= EMFModuleMesh_END) {
|
|
||||||
if (level == 1) {
|
|
||||||
//Find mesh name ...
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
removeEndLine(inputDataLine);
|
|
||||||
currentMeshName = inputDataLine;
|
|
||||||
currentMode = EMFModuleMeshNamed;
|
|
||||||
EGE_VERBOSE(" "<< currentMeshName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (level == 2) {
|
|
||||||
// In the mesh level 2 the line size must not exced 2048
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
removeEndLine(inputDataLine);
|
|
||||||
if(0 == strncmp(inputDataLine, "Vertex", 6) ) {
|
|
||||||
currentMode = EMFModuleMeshVertex;
|
|
||||||
EGE_VERBOSE(" Vertex ...");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "UV-mapping", 10) ) {
|
|
||||||
currentMode = EMFModuleMeshUVMapping;
|
|
||||||
EGE_VERBOSE(" UV-mapping ...");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "Normal(vertex)", 14) ) {
|
|
||||||
currentMode = EMFModuleMeshNormalVertex;
|
|
||||||
EGE_VERBOSE(" Normal(vertex) ...");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "Normal(face)", 12) ) {
|
|
||||||
currentMode = EMFModuleMeshNormalFace;
|
|
||||||
EGE_VERBOSE(" Normal(face) ...");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "Face", 4) ) {
|
|
||||||
currentMode = EMFModuleMeshFace;
|
|
||||||
EGE_VERBOSE(" Face ...");
|
|
||||||
} else if(0 == strncmp(inputDataLine, "Physics", 7) ) {
|
|
||||||
currentMode = EMFModuleMeshPhysics;
|
|
||||||
EGE_VERBOSE(" Physics ...");
|
|
||||||
} else {
|
|
||||||
EGE_ERROR(" Unknow mesh property '"<<inputDataLine<<"'");
|
|
||||||
currentMode = EMFModuleMeshNamed;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// level > 2
|
|
||||||
switch (currentMode) {
|
|
||||||
default:
|
|
||||||
EGE_ERROR("Unknow ... "<< level);
|
|
||||||
jumpEndLine(fileName);
|
|
||||||
break;
|
|
||||||
case EMFModuleMeshVertex: {
|
|
||||||
vec3 vertex(0,0,0);
|
|
||||||
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
|
||||||
if (inputDataLine[0] == '\0') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sscanf(inputDataLine, "%f %f %f", &vertex.m_floats[0], &vertex.m_floats[1], &vertex.m_floats[2] );
|
|
||||||
m_listVertex.push_back(vertex);
|
|
||||||
int32_t len = strlen(inputDataLine)-1;
|
|
||||||
if( inputDataLine[len] == '\n'
|
|
||||||
|| inputDataLine[len] == '\r') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EGE_VERBOSE(" " << m_listVertex.size() << " vertex");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EMFModuleMeshUVMapping: {
|
|
||||||
vec2 uvMap(0,0);
|
|
||||||
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
|
||||||
if (inputDataLine[0] == '\0') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sscanf(inputDataLine, "%f %f", &uvMap.m_floats[0], &uvMap.m_floats[1]);
|
|
||||||
m_listUV.push_back(uvMap);
|
|
||||||
int32_t len = strlen(inputDataLine)-1;
|
|
||||||
if( inputDataLine[len] == '\n'
|
|
||||||
|| inputDataLine[len] == '\r') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EGE_VERBOSE(" " << m_listUV.size() << " coord");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EMFModuleMeshNormalVertex: {
|
|
||||||
m_normalMode = normalModeVertex;
|
|
||||||
vec3 normal(0,0,0);
|
|
||||||
// find the vertex Normal list.
|
|
||||||
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
|
||||||
if (inputDataLine[0] == '\0') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sscanf(inputDataLine, "%f %f %f", &normal.m_floats[0], &normal.m_floats[1], &normal.m_floats[2] );
|
|
||||||
m_listVertexNormal.push_back(normal);
|
|
||||||
int32_t len = strlen(inputDataLine)-1;
|
|
||||||
if( inputDataLine[len] == '\n'
|
|
||||||
|| inputDataLine[len] == '\r') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EGE_VERBOSE(" " << m_listVertexNormal.size() << " Normals");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EMFModuleMeshNormalFace: {
|
|
||||||
m_normalMode = normalModeFace;
|
|
||||||
vec3 normal(0,0,0);
|
|
||||||
// find the face Normal list.
|
|
||||||
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
|
||||||
if (inputDataLine[0] == '\0') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sscanf(inputDataLine, "%f %f %f", &normal.m_floats[0], &normal.m_floats[1], &normal.m_floats[2] );
|
|
||||||
m_listFacesNormal.push_back(normal);
|
|
||||||
int32_t len = strlen(inputDataLine)-1;
|
|
||||||
if( inputDataLine[len] == '\n'
|
|
||||||
|| inputDataLine[len] == '\r') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EGE_VERBOSE(" " << m_listFacesNormal.size() << " Normals");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case EMFModuleMeshFace:
|
|
||||||
case EMFModuleMeshFaceMaterial:
|
|
||||||
if (level == 3) {
|
|
||||||
//Find mesh name ...
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
removeEndLine(inputDataLine);
|
|
||||||
// new maretial selection
|
|
||||||
currentMode = EMFModuleMeshFaceMaterial;
|
|
||||||
FaceIndexing empty;
|
|
||||||
m_listFaces.add(inputDataLine, empty);
|
|
||||||
meshFaceMaterialID = m_listFaces.getId(inputDataLine);
|
|
||||||
EGE_VERBOSE(" " << inputDataLine);
|
|
||||||
} else if (currentMode == EMFModuleMeshFaceMaterial) {
|
|
||||||
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
|
||||||
if (inputDataLine[0] == '\0') {
|
|
||||||
// end of line
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (meshFaceMaterialID < 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
uint32_t vertexIndex[3], uvIndex[3], normalIndex[3];
|
|
||||||
vertexIndex[0] = 0;
|
|
||||||
vertexIndex[1] = 0;
|
|
||||||
vertexIndex[2] = 0;
|
|
||||||
uvIndex[0] = 0;
|
|
||||||
uvIndex[1] = 0;
|
|
||||||
uvIndex[2] = 0;
|
|
||||||
normalIndex[0] = 0;
|
|
||||||
normalIndex[1] = 0;
|
|
||||||
normalIndex[2] = 0;
|
|
||||||
sscanf(inputDataLine, "%d/%d/%d %d/%d/%d %d/%d/%d",
|
|
||||||
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
|
||||||
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
|
||||||
&vertexIndex[2], &uvIndex[2], &normalIndex[2] );
|
|
||||||
m_listFaces.getValue(meshFaceMaterialID).m_faces.push_back(Face(vertexIndex[0], uvIndex[0], normalIndex[0],
|
|
||||||
vertexIndex[1], uvIndex[1], normalIndex[1],
|
|
||||||
vertexIndex[2], uvIndex[2], normalIndex[2]));
|
|
||||||
/*
|
|
||||||
EGE_DEBUG("face :" << vertexIndex[0] << "/" << uvIndex[0] << "/" << normalIndex[0] <<
|
|
||||||
" " << vertexIndex[1] << "/" << uvIndex[1] << "/" << normalIndex[1] <<
|
|
||||||
" " << vertexIndex[2] << "/" << uvIndex[2] << "/" << normalIndex[2]);
|
|
||||||
*/
|
|
||||||
int32_t len = strlen(inputDataLine)-1;
|
|
||||||
if( inputDataLine[len] == '\n'
|
|
||||||
|| inputDataLine[len] == '\r') {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EGE_VERBOSE(" " << m_listFaces.getValue(meshFaceMaterialID).m_faces.size() << " faces");
|
|
||||||
} else {
|
|
||||||
// insert element without material ...
|
|
||||||
EGE_ERROR(" try to add face without material selection ...");
|
|
||||||
jumpEndLine(fileName);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EMFModuleMeshPhysics:
|
|
||||||
case EMFModuleMeshPhysicsNamed:
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true, false, false)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
removeEndLine(inputDataLine);
|
|
||||||
if (level == 3) {
|
|
||||||
physics = ege::PhysicsShape::create(inputDataLine);
|
|
||||||
if (physics == nullptr) {
|
|
||||||
EGE_ERROR("Allocation error when creating physical shape ...");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
m_physics.push_back(physics);
|
|
||||||
EGE_VERBOSE(" " << m_physics.size() << " " << inputDataLine);
|
|
||||||
currentMode = EMFModuleMeshPhysicsNamed;
|
|
||||||
} else if (currentMode == EMFModuleMeshPhysicsNamed) {
|
|
||||||
if (physics == nullptr) {
|
|
||||||
EGE_ERROR("Can not parse :'" << inputDataLine << "' in physical shape ...");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (false == physics->parse(inputDataLine)) {
|
|
||||||
EGE_ERROR("ERROR when parsing :'" << inputDataLine << "' in physical shape ...");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
} else if (currentMode >= EMFModuleMaterial && currentMode <= EMFModuleMaterial_END) {
|
|
||||||
// all material element is stored on 1 line (size < 2048)
|
|
||||||
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
|
||||||
// reach end of file ...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
removeEndLine(inputDataLine);
|
|
||||||
if (level == 1) {
|
|
||||||
// add previous material :
|
|
||||||
if( materialName != ""
|
|
||||||
&& material!=nullptr) {
|
|
||||||
m_materials.add(materialName, material);
|
|
||||||
materialName = "";
|
|
||||||
material = nullptr;
|
|
||||||
}
|
|
||||||
material = std::make_shared<ege::Material>();
|
|
||||||
materialName = inputDataLine;
|
|
||||||
currentMode = EMFModuleMaterialNamed;
|
|
||||||
EGE_VERBOSE(" "<< materialName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// level >1
|
|
||||||
if (currentMode != EMFModuleMaterialNamed) {
|
|
||||||
EGE_WARNING(" Unknow element ..."<< level);
|
|
||||||
jumpEndLine(fileName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (nullptr == material) {
|
|
||||||
EGE_ERROR("material allocation error");
|
|
||||||
jumpEndLine(fileName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(0 == strncmp(inputDataLine,"Ns ",3)) {
|
|
||||||
float tmpVal=0;
|
|
||||||
sscanf(&inputDataLine[3], "%f", &tmpVal);
|
|
||||||
material->setShininess(tmpVal);
|
|
||||||
EGE_VERBOSE(" Shininess " << tmpVal);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"Ka ",3)) {
|
|
||||||
float tmpVal1=0;
|
|
||||||
float tmpVal2=0;
|
|
||||||
float tmpVal3=0;
|
|
||||||
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
|
||||||
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
|
||||||
material->setAmbientFactor(tmp);
|
|
||||||
EGE_VERBOSE(" AmbientFactor " << tmp);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"Kd ",3)) {
|
|
||||||
float tmpVal1=0;
|
|
||||||
float tmpVal2=0;
|
|
||||||
float tmpVal3=0;
|
|
||||||
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
|
||||||
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
|
||||||
material->setDiffuseFactor(tmp);
|
|
||||||
EGE_VERBOSE(" DiffuseFactor " << tmp);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"Ks ",3)) {
|
|
||||||
float tmpVal1=0;
|
|
||||||
float tmpVal2=0;
|
|
||||||
float tmpVal3=0;
|
|
||||||
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
|
||||||
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
|
||||||
material->setSpecularFactor(tmp);
|
|
||||||
EGE_VERBOSE(" SpecularFactor " << tmp);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"Ni ",3)) {
|
|
||||||
float tmpVal=0;
|
|
||||||
sscanf(&inputDataLine[3], "%f", &tmpVal);
|
|
||||||
// TODO : ...
|
|
||||||
EGE_VERBOSE(" Ni " << tmpVal);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"d ",2)) {
|
|
||||||
float tmpVal=0;
|
|
||||||
sscanf(&inputDataLine[2], "%f", &tmpVal);
|
|
||||||
// TODO : ...
|
|
||||||
EGE_VERBOSE(" d " << tmpVal);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"illum ",6)) {
|
|
||||||
int tmpVal=0;
|
|
||||||
sscanf(&inputDataLine[6], "%d", &tmpVal);
|
|
||||||
// TODO : ...
|
|
||||||
EGE_VERBOSE(" illum " << tmpVal);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"map_Kd ",7)) {
|
|
||||||
material->setTexture0(fileName.getRelativeFolder() + &inputDataLine[7]);
|
|
||||||
EGE_VERBOSE(" Texture " << &inputDataLine[7]);
|
|
||||||
} else if(0 == strncmp(inputDataLine,"renderMode ",11)) {
|
|
||||||
ewol::openGL::renderMode mode;
|
|
||||||
etk::from_string(mode, &inputDataLine[11]);
|
|
||||||
material->setRenderMode(mode);
|
|
||||||
EGE_VERBOSE(" Texture " << mode);
|
|
||||||
} else {
|
|
||||||
EGE_ERROR("unknow material property ... : '" << inputDataLine << "'");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// unknow ...
|
|
||||||
EGE_WARNING("Unknow type of line == > jump end of line ... ");
|
|
||||||
jumpEndLine(fileName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// add last material ...
|
|
||||||
if( materialName != ""
|
|
||||||
&& material!=nullptr) {
|
|
||||||
m_materials.add(materialName, material);
|
|
||||||
materialName = "";
|
|
||||||
material.reset();
|
|
||||||
}
|
|
||||||
EGE_VERBOSE("Stop parsing Mesh file");
|
|
||||||
|
|
||||||
fileName.fileClose();
|
|
||||||
generateVBO();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ege::resource::Mesh::addMaterial(const std::string& _name, std::shared_ptr<ege::Material> _data) {
|
void ege::resource::Mesh::addMaterial(const std::string& _name, std::shared_ptr<ege::Material> _data) {
|
||||||
if (nullptr == _data) {
|
if (nullptr == _data) {
|
||||||
@ -1074,7 +455,7 @@ void ege::resource::Mesh::addPoint(const std::string& _layerName, const vec3& _p
|
|||||||
m_listFaces[_layerName].m_faces.push_back(tmpFace);
|
m_listFaces[_layerName].m_faces.push_back(tmpFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ege::resource::Mesh::addLine(const std::string& _layerName, const vec3& _pos1, const vec3& _pos2, const etk::Color<float>& _color) {
|
void ege::resource::Mesh::addLine(const std::string& _layerName, const vec3& _pos1, const vec3& _pos2, const etk::Color<float>& _color1, const etk::Color<float>& _color2) {
|
||||||
if ( m_listFaces.exist(_layerName) == false
|
if ( m_listFaces.exist(_layerName) == false
|
||||||
|| m_materials.exist(_layerName) == false) {
|
|| m_materials.exist(_layerName) == false) {
|
||||||
EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << m_listFaces.exist(_layerName) << " materials=" << m_listFaces.exist(_layerName) << " ...");
|
EGE_ERROR("Mesh layer : " << _layerName << " does not exist in list faces=" << m_listFaces.exist(_layerName) << " materials=" << m_listFaces.exist(_layerName) << " ...");
|
||||||
@ -1091,13 +472,31 @@ void ege::resource::Mesh::addLine(const std::string& _layerName, const vec3& _po
|
|||||||
int32_t pos1 = findPositionInList(_pos1);
|
int32_t pos1 = findPositionInList(_pos1);
|
||||||
int32_t pos2 = findPositionInList(_pos2);
|
int32_t pos2 = findPositionInList(_pos2);
|
||||||
// try to find UV mapping:
|
// try to find UV mapping:
|
||||||
int32_t color = findColorInList(_color);
|
int32_t color1 = findColorInList(_color1);
|
||||||
|
int32_t color2 = findColorInList(_color2);
|
||||||
Face tmpFace;
|
Face tmpFace;
|
||||||
tmpFace.setVertex(pos1, pos2);
|
tmpFace.setVertex(pos1, pos2);
|
||||||
tmpFace.setColor(color, color, color);
|
tmpFace.setColor(color1, color2, color2);
|
||||||
m_listFaces[_layerName].m_faces.push_back(tmpFace);
|
m_listFaces[_layerName].m_faces.push_back(tmpFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ege::resource::Mesh::addLines(const std::string& _layerName, const std::vector<vec3>& _list, const etk::Color<float>& _color) {
|
||||||
|
for (size_t iii=1; iii<_list.size(); ++iii) {
|
||||||
|
addLine(_layerName, _list[iii-1], _list[iii], _color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ege::resource::Mesh::addLines(const std::string& _layerName, const std::vector<vec3>& _list, const std::vector<etk::Color<float>>& _color) {
|
||||||
|
if (_color.size() != _list.size()) {
|
||||||
|
EGE_ERROR("Can not add line with changing color without same number of color");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (size_t iii=1; iii<_list.size(); ++iii) {
|
||||||
|
addLine(_layerName, _list[iii-1], _list[iii], _color[iii-1], _color[iii]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ege::resource::Mesh::addTriangle(const std::string& _layerName,
|
void ege::resource::Mesh::addTriangle(const std::string& _layerName,
|
||||||
const vec3& _pos1, const vec3& _pos2, const vec3& _pos3,
|
const vec3& _pos1, const vec3& _pos2, const vec3& _pos3,
|
||||||
const vec2& _uv1, const vec2& _uv2, const vec2& _uv3,
|
const vec2& _uv1, const vec2& _uv2, const vec2& _uv3,
|
||||||
|
@ -22,20 +22,18 @@
|
|||||||
#include <ege/resource/tools/FaceIndexing.h>
|
#include <ege/resource/tools/FaceIndexing.h>
|
||||||
|
|
||||||
#include <ege/physicsShape/PhysicsShape.h>
|
#include <ege/physicsShape/PhysicsShape.h>
|
||||||
// 3 "float" elements
|
// VBO table property:
|
||||||
#define MESH_VBO_VERTICES (0)
|
#define MESH_VBO_VERTICES (0)
|
||||||
// 2 "float" elements
|
|
||||||
#define MESH_VBO_TEXTURE (1)
|
#define MESH_VBO_TEXTURE (1)
|
||||||
// 3 "float" elements
|
|
||||||
#define MESH_VBO_VERTICES_NORMAL (2)
|
#define MESH_VBO_VERTICES_NORMAL (2)
|
||||||
// Face normal position :
|
|
||||||
#define MESH_VBO_FACE_NORMAL (3)
|
#define MESH_VBO_FACE_NORMAL (3)
|
||||||
// 4 "float" elements
|
|
||||||
#define MESH_VBO_COLOR (4)
|
#define MESH_VBO_COLOR (4)
|
||||||
|
|
||||||
namespace ege {
|
namespace ege {
|
||||||
namespace resource {
|
namespace resource {
|
||||||
class Mesh : public ewol::Resource {
|
class Mesh : public ewol::Resource {
|
||||||
|
public:
|
||||||
|
static std::shared_ptr<ege::resource::Mesh> createGrid(int32_t _lineCount, const vec3& _position=vec3(0,0,0), float _size=1.0f, const std::string& _materialName="basics");
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @not-in-doc
|
* @not-in-doc
|
||||||
@ -146,7 +144,12 @@ namespace ege {
|
|||||||
|
|
||||||
void addPoint(const std::string& _layerName, const vec3& _pos, const etk::Color<float>& _color);
|
void addPoint(const std::string& _layerName, const vec3& _pos, const etk::Color<float>& _color);
|
||||||
|
|
||||||
void addLine(const std::string& _layerName, const vec3& _pos1, const vec3& _pos2, const etk::Color<float>& _color);
|
void addLine(const std::string& _layerName, const vec3& _pos1, const vec3& _pos2, const etk::Color<float>& _color) {
|
||||||
|
addLine( _layerName, _pos1, _pos2, _color, _color);
|
||||||
|
}
|
||||||
|
void addLine(const std::string& _layerName, const vec3& _pos1, const vec3& _pos2, const etk::Color<float>& _color1, const etk::Color<float>& _color2);
|
||||||
|
void addLines(const std::string& _layerName, const std::vector<vec3>& _list, const etk::Color<float>& _color);
|
||||||
|
void addLines(const std::string& _layerName, const std::vector<vec3>& _list, const std::vector<etk::Color<float>>& _color);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @not-in-doc
|
* @not-in-doc
|
||||||
|
512
ege/resource/MeshEmf.cpp
Normal file
512
ege/resource/MeshEmf.cpp
Normal file
@ -0,0 +1,512 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license BSD v3 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ege/debug.h>
|
||||||
|
#include <ege/resource/Mesh.h>
|
||||||
|
#include <etk/os/FSNode.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void jumpEndLine(etk::FSNode& _file) {
|
||||||
|
char current=_file.fileGet();
|
||||||
|
while( current != '\0'
|
||||||
|
&& current != '\n') {
|
||||||
|
//printf("%c", current);
|
||||||
|
current=_file.fileGet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t countIndent(etk::FSNode& _file) {
|
||||||
|
int32_t nbIndent=0;
|
||||||
|
int32_t nbSpacesTab=0;
|
||||||
|
int32_t nbChar=0;
|
||||||
|
//EGE_DEBUG(" start count Indent");
|
||||||
|
for(char current=_file.fileGet(); current != '\0'; current=_file.fileGet()) {
|
||||||
|
nbChar++;
|
||||||
|
//EGE_DEBUG("parse : " << current);
|
||||||
|
if (current == '\t') {
|
||||||
|
nbSpacesTab = 0;
|
||||||
|
nbIndent++;
|
||||||
|
} else if (current == ' ') {
|
||||||
|
nbSpacesTab++;
|
||||||
|
if (nbSpacesTab == 4) {
|
||||||
|
nbSpacesTab = 0;
|
||||||
|
nbIndent++;
|
||||||
|
}
|
||||||
|
} else if (current == '#') {
|
||||||
|
// Auto remove comment ...
|
||||||
|
jumpEndLine(_file);
|
||||||
|
return countIndent(_file);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//EGE_DEBUG("indent : " << nbIndent);
|
||||||
|
_file.fileSeek(-nbChar, etk::FSN_SEEK_CURRENT);
|
||||||
|
return nbIndent;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* loadNextData(char* _elementLine,
|
||||||
|
int64_t _maxData,
|
||||||
|
etk::FSNode& _file,
|
||||||
|
bool _removeTabs=false,
|
||||||
|
bool _stopColomn=false,
|
||||||
|
bool _stopPipe=true) {
|
||||||
|
memset(_elementLine, 0, _maxData);
|
||||||
|
char * element = _elementLine;
|
||||||
|
int64_t outSize = 0;
|
||||||
|
/*
|
||||||
|
if (m_zipReadingOffset >= m_zipContent->size()) {
|
||||||
|
element[0] = '\0';
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
char current = _file.fileGet();
|
||||||
|
while (current != '\0') {
|
||||||
|
if( _removeTabs == false
|
||||||
|
|| element != _elementLine) {
|
||||||
|
*element = current;
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
if( current == '\n'
|
||||||
|
|| current == '\r'
|
||||||
|
|| ( current == '|'
|
||||||
|
&& _stopPipe == true)
|
||||||
|
|| ( current == ':'
|
||||||
|
&& _stopColomn == true) )
|
||||||
|
{
|
||||||
|
*element = '\0';
|
||||||
|
//EGE_DEBUG(" plop : '" << _elementLine << "'" );
|
||||||
|
return _elementLine;
|
||||||
|
} else if( element == _elementLine
|
||||||
|
&& current != '\t') {
|
||||||
|
*element = current;
|
||||||
|
element++;
|
||||||
|
}
|
||||||
|
// check maxData size ...
|
||||||
|
if (outSize >= _maxData-1) {
|
||||||
|
*element = '\0';
|
||||||
|
return _elementLine;
|
||||||
|
}
|
||||||
|
current = _file.fileGet();
|
||||||
|
}
|
||||||
|
if (outSize == 0) {
|
||||||
|
return nullptr;
|
||||||
|
} else {
|
||||||
|
// send last line
|
||||||
|
return _elementLine;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void removeEndLine(char* _val) {
|
||||||
|
int32_t len = strlen(_val);
|
||||||
|
if( len>0
|
||||||
|
&& ( _val[len-1] == '\n'
|
||||||
|
|| _val[len-1] == '\r' ) ) {
|
||||||
|
_val[len-1] = '\0';
|
||||||
|
}
|
||||||
|
len--;
|
||||||
|
if( len>0
|
||||||
|
&& ( _val[len-1] == '\n'
|
||||||
|
|| _val[len-1] == '\r') ) {
|
||||||
|
_val[len-1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum emfModuleMode {
|
||||||
|
EMFModuleNone,
|
||||||
|
EMFModuleMesh,
|
||||||
|
EMFModuleMeshNamed,
|
||||||
|
EMFModuleMeshVertex,
|
||||||
|
EMFModuleMeshUVMapping,
|
||||||
|
EMFModuleMeshNormalVertex,
|
||||||
|
EMFModuleMeshNormalFace,
|
||||||
|
EMFModuleMeshFace,
|
||||||
|
EMFModuleMeshFaceMaterial,
|
||||||
|
EMFModuleMeshPhysics,
|
||||||
|
EMFModuleMeshPhysicsNamed,
|
||||||
|
EMFModuleMesh_END,
|
||||||
|
EMFModuleMaterial,
|
||||||
|
EMFModuleMaterialNamed,
|
||||||
|
EMFModuleMaterial_END,
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO : rework with string line extractor
|
||||||
|
bool ege::resource::Mesh::loadEMF(const std::string& _fileName) {
|
||||||
|
m_checkNormal = true;
|
||||||
|
m_normalMode = normalModeNone;
|
||||||
|
etk::FSNode fileName(_fileName);
|
||||||
|
// get the fileSize ...
|
||||||
|
int32_t size = fileName.fileSize();
|
||||||
|
if (size == 0 ) {
|
||||||
|
EGE_ERROR("No data in the file named=\"" << fileName << "\"");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(false == fileName.fileOpenRead() ) {
|
||||||
|
EGE_ERROR("Can not find the file name=\"" << fileName << "\"");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char inputDataLine[2048];
|
||||||
|
// load the first line :
|
||||||
|
fileName.fileGets(inputDataLine, 2048);
|
||||||
|
if(0 == strncmp(inputDataLine, "EMF(STRING)", 11)) {
|
||||||
|
// parse in string mode ...
|
||||||
|
} else if (0 == strncmp(inputDataLine, "EMF(BINARY)", 11)) {
|
||||||
|
EGE_ERROR(" file binary mode is not supported now : 'EMF(BINARY)'");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
EGE_ERROR(" file mode is not supported now : 'EMF(? ? ?)' = '" << inputDataLine << "'");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
enum emfModuleMode currentMode = EMFModuleNone;
|
||||||
|
EGE_VERBOSE("Start parsing Mesh file : " << fileName);
|
||||||
|
// mesh global param :
|
||||||
|
std::string currentMeshName = "";
|
||||||
|
int32_t meshFaceMaterialID = -1;
|
||||||
|
// material global param :
|
||||||
|
std::string materialName = "";
|
||||||
|
std::shared_ptr<ege::Material> material;
|
||||||
|
// physical shape:
|
||||||
|
std::shared_ptr<ege::PhysicsShape> physics;
|
||||||
|
while(1) {
|
||||||
|
int32_t level = countIndent(fileName);
|
||||||
|
if (level == 0) {
|
||||||
|
// new section ...
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(0 == strncmp(inputDataLine, "Mesh :", 6) ) {
|
||||||
|
currentMode = EMFModuleMesh;
|
||||||
|
EGE_VERBOSE("Parse Mesh :");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "Materials : ", 11) ) {
|
||||||
|
currentMode = EMFModuleMaterial;
|
||||||
|
EGE_VERBOSE("Parse Material :");
|
||||||
|
} else {
|
||||||
|
currentMode = EMFModuleNone;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (currentMode >= EMFModuleMesh && currentMode <= EMFModuleMesh_END) {
|
||||||
|
if (level == 1) {
|
||||||
|
//Find mesh name ...
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
removeEndLine(inputDataLine);
|
||||||
|
currentMeshName = inputDataLine;
|
||||||
|
currentMode = EMFModuleMeshNamed;
|
||||||
|
EGE_VERBOSE(" "<< currentMeshName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (level == 2) {
|
||||||
|
// In the mesh level 2 the line size must not exced 2048
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
removeEndLine(inputDataLine);
|
||||||
|
if(0 == strncmp(inputDataLine, "Vertex", 6) ) {
|
||||||
|
currentMode = EMFModuleMeshVertex;
|
||||||
|
EGE_VERBOSE(" Vertex ...");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "UV-mapping", 10) ) {
|
||||||
|
currentMode = EMFModuleMeshUVMapping;
|
||||||
|
EGE_VERBOSE(" UV-mapping ...");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "Normal(vertex)", 14) ) {
|
||||||
|
currentMode = EMFModuleMeshNormalVertex;
|
||||||
|
EGE_VERBOSE(" Normal(vertex) ...");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "Normal(face)", 12) ) {
|
||||||
|
currentMode = EMFModuleMeshNormalFace;
|
||||||
|
EGE_VERBOSE(" Normal(face) ...");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "Face", 4) ) {
|
||||||
|
currentMode = EMFModuleMeshFace;
|
||||||
|
EGE_VERBOSE(" Face ...");
|
||||||
|
} else if(0 == strncmp(inputDataLine, "Physics", 7) ) {
|
||||||
|
currentMode = EMFModuleMeshPhysics;
|
||||||
|
EGE_VERBOSE(" Physics ...");
|
||||||
|
} else {
|
||||||
|
EGE_ERROR(" Unknow mesh property '"<<inputDataLine<<"'");
|
||||||
|
currentMode = EMFModuleMeshNamed;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// level > 2
|
||||||
|
switch (currentMode) {
|
||||||
|
default:
|
||||||
|
EGE_ERROR("Unknow ... "<< level);
|
||||||
|
jumpEndLine(fileName);
|
||||||
|
break;
|
||||||
|
case EMFModuleMeshVertex: {
|
||||||
|
vec3 vertex(0,0,0);
|
||||||
|
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
||||||
|
if (inputDataLine[0] == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sscanf(inputDataLine, "%f %f %f", &vertex.m_floats[0], &vertex.m_floats[1], &vertex.m_floats[2] );
|
||||||
|
m_listVertex.push_back(vertex);
|
||||||
|
int32_t len = strlen(inputDataLine)-1;
|
||||||
|
if( inputDataLine[len] == '\n'
|
||||||
|
|| inputDataLine[len] == '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EGE_VERBOSE(" " << m_listVertex.size() << " vertex");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EMFModuleMeshUVMapping: {
|
||||||
|
vec2 uvMap(0,0);
|
||||||
|
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
||||||
|
if (inputDataLine[0] == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sscanf(inputDataLine, "%f %f", &uvMap.m_floats[0], &uvMap.m_floats[1]);
|
||||||
|
m_listUV.push_back(uvMap);
|
||||||
|
int32_t len = strlen(inputDataLine)-1;
|
||||||
|
if( inputDataLine[len] == '\n'
|
||||||
|
|| inputDataLine[len] == '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EGE_VERBOSE(" " << m_listUV.size() << " coord");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EMFModuleMeshNormalVertex: {
|
||||||
|
m_normalMode = normalModeVertex;
|
||||||
|
vec3 normal(0,0,0);
|
||||||
|
// find the vertex Normal list.
|
||||||
|
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
||||||
|
if (inputDataLine[0] == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sscanf(inputDataLine, "%f %f %f", &normal.m_floats[0], &normal.m_floats[1], &normal.m_floats[2] );
|
||||||
|
m_listVertexNormal.push_back(normal);
|
||||||
|
int32_t len = strlen(inputDataLine)-1;
|
||||||
|
if( inputDataLine[len] == '\n'
|
||||||
|
|| inputDataLine[len] == '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EGE_VERBOSE(" " << m_listVertexNormal.size() << " Normals");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EMFModuleMeshNormalFace: {
|
||||||
|
m_normalMode = normalModeFace;
|
||||||
|
vec3 normal(0,0,0);
|
||||||
|
// find the face Normal list.
|
||||||
|
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
||||||
|
if (inputDataLine[0] == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sscanf(inputDataLine, "%f %f %f", &normal.m_floats[0], &normal.m_floats[1], &normal.m_floats[2] );
|
||||||
|
m_listFacesNormal.push_back(normal);
|
||||||
|
int32_t len = strlen(inputDataLine)-1;
|
||||||
|
if( inputDataLine[len] == '\n'
|
||||||
|
|| inputDataLine[len] == '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EGE_VERBOSE(" " << m_listFacesNormal.size() << " Normals");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EMFModuleMeshFace:
|
||||||
|
case EMFModuleMeshFaceMaterial:
|
||||||
|
if (level == 3) {
|
||||||
|
//Find mesh name ...
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
removeEndLine(inputDataLine);
|
||||||
|
// new maretial selection
|
||||||
|
currentMode = EMFModuleMeshFaceMaterial;
|
||||||
|
FaceIndexing empty;
|
||||||
|
m_listFaces.add(inputDataLine, empty);
|
||||||
|
meshFaceMaterialID = m_listFaces.getId(inputDataLine);
|
||||||
|
EGE_VERBOSE(" " << inputDataLine);
|
||||||
|
} else if (currentMode == EMFModuleMeshFaceMaterial) {
|
||||||
|
while (nullptr != loadNextData(inputDataLine, 2048, fileName, true, true) ) {
|
||||||
|
if (inputDataLine[0] == '\0') {
|
||||||
|
// end of line
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (meshFaceMaterialID < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uint32_t vertexIndex[3], uvIndex[3], normalIndex[3];
|
||||||
|
vertexIndex[0] = 0;
|
||||||
|
vertexIndex[1] = 0;
|
||||||
|
vertexIndex[2] = 0;
|
||||||
|
uvIndex[0] = 0;
|
||||||
|
uvIndex[1] = 0;
|
||||||
|
uvIndex[2] = 0;
|
||||||
|
normalIndex[0] = 0;
|
||||||
|
normalIndex[1] = 0;
|
||||||
|
normalIndex[2] = 0;
|
||||||
|
sscanf(inputDataLine, "%d/%d/%d %d/%d/%d %d/%d/%d",
|
||||||
|
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
||||||
|
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
||||||
|
&vertexIndex[2], &uvIndex[2], &normalIndex[2] );
|
||||||
|
m_listFaces.getValue(meshFaceMaterialID).m_faces.push_back(Face(vertexIndex[0], uvIndex[0], normalIndex[0],
|
||||||
|
vertexIndex[1], uvIndex[1], normalIndex[1],
|
||||||
|
vertexIndex[2], uvIndex[2], normalIndex[2]));
|
||||||
|
/*
|
||||||
|
EGE_DEBUG("face :" << vertexIndex[0] << "/" << uvIndex[0] << "/" << normalIndex[0] <<
|
||||||
|
" " << vertexIndex[1] << "/" << uvIndex[1] << "/" << normalIndex[1] <<
|
||||||
|
" " << vertexIndex[2] << "/" << uvIndex[2] << "/" << normalIndex[2]);
|
||||||
|
*/
|
||||||
|
int32_t len = strlen(inputDataLine)-1;
|
||||||
|
if( inputDataLine[len] == '\n'
|
||||||
|
|| inputDataLine[len] == '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EGE_VERBOSE(" " << m_listFaces.getValue(meshFaceMaterialID).m_faces.size() << " faces");
|
||||||
|
} else {
|
||||||
|
// insert element without material ...
|
||||||
|
EGE_ERROR(" try to add face without material selection ...");
|
||||||
|
jumpEndLine(fileName);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EMFModuleMeshPhysics:
|
||||||
|
case EMFModuleMeshPhysicsNamed:
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true, false, false)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
removeEndLine(inputDataLine);
|
||||||
|
if (level == 3) {
|
||||||
|
physics = ege::PhysicsShape::create(inputDataLine);
|
||||||
|
if (physics == nullptr) {
|
||||||
|
EGE_ERROR("Allocation error when creating physical shape ...");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
m_physics.push_back(physics);
|
||||||
|
EGE_VERBOSE(" " << m_physics.size() << " " << inputDataLine);
|
||||||
|
currentMode = EMFModuleMeshPhysicsNamed;
|
||||||
|
} else if (currentMode == EMFModuleMeshPhysicsNamed) {
|
||||||
|
if (physics == nullptr) {
|
||||||
|
EGE_ERROR("Can not parse :'" << inputDataLine << "' in physical shape ...");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (false == physics->parse(inputDataLine)) {
|
||||||
|
EGE_ERROR("ERROR when parsing :'" << inputDataLine << "' in physical shape ...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
} else if (currentMode >= EMFModuleMaterial && currentMode <= EMFModuleMaterial_END) {
|
||||||
|
// all material element is stored on 1 line (size < 2048)
|
||||||
|
if (nullptr == loadNextData(inputDataLine, 2048, fileName, true)) {
|
||||||
|
// reach end of file ...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
removeEndLine(inputDataLine);
|
||||||
|
if (level == 1) {
|
||||||
|
// add previous material :
|
||||||
|
if( materialName != ""
|
||||||
|
&& material!=nullptr) {
|
||||||
|
m_materials.add(materialName, material);
|
||||||
|
materialName = "";
|
||||||
|
material = nullptr;
|
||||||
|
}
|
||||||
|
material = std::make_shared<ege::Material>();
|
||||||
|
materialName = inputDataLine;
|
||||||
|
currentMode = EMFModuleMaterialNamed;
|
||||||
|
EGE_VERBOSE(" "<< materialName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// level >1
|
||||||
|
if (currentMode != EMFModuleMaterialNamed) {
|
||||||
|
EGE_WARNING(" Unknow element ..."<< level);
|
||||||
|
jumpEndLine(fileName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (nullptr == material) {
|
||||||
|
EGE_ERROR("material allocation error");
|
||||||
|
jumpEndLine(fileName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(0 == strncmp(inputDataLine,"Ns ",3)) {
|
||||||
|
float tmpVal=0;
|
||||||
|
sscanf(&inputDataLine[3], "%f", &tmpVal);
|
||||||
|
material->setShininess(tmpVal);
|
||||||
|
EGE_VERBOSE(" Shininess " << tmpVal);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"Ka ",3)) {
|
||||||
|
float tmpVal1=0;
|
||||||
|
float tmpVal2=0;
|
||||||
|
float tmpVal3=0;
|
||||||
|
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
||||||
|
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
||||||
|
material->setAmbientFactor(tmp);
|
||||||
|
EGE_VERBOSE(" AmbientFactor " << tmp);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"Kd ",3)) {
|
||||||
|
float tmpVal1=0;
|
||||||
|
float tmpVal2=0;
|
||||||
|
float tmpVal3=0;
|
||||||
|
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
||||||
|
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
||||||
|
material->setDiffuseFactor(tmp);
|
||||||
|
EGE_VERBOSE(" DiffuseFactor " << tmp);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"Ks ",3)) {
|
||||||
|
float tmpVal1=0;
|
||||||
|
float tmpVal2=0;
|
||||||
|
float tmpVal3=0;
|
||||||
|
sscanf(&inputDataLine[3], "%f %f %f", &tmpVal1, &tmpVal2, &tmpVal3);
|
||||||
|
vec4 tmp(tmpVal1, tmpVal2, tmpVal3, 1);
|
||||||
|
material->setSpecularFactor(tmp);
|
||||||
|
EGE_VERBOSE(" SpecularFactor " << tmp);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"Ni ",3)) {
|
||||||
|
float tmpVal=0;
|
||||||
|
sscanf(&inputDataLine[3], "%f", &tmpVal);
|
||||||
|
// TODO : ...
|
||||||
|
EGE_VERBOSE(" Ni " << tmpVal);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"d ",2)) {
|
||||||
|
float tmpVal=0;
|
||||||
|
sscanf(&inputDataLine[2], "%f", &tmpVal);
|
||||||
|
// TODO : ...
|
||||||
|
EGE_VERBOSE(" d " << tmpVal);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"illum ",6)) {
|
||||||
|
int tmpVal=0;
|
||||||
|
sscanf(&inputDataLine[6], "%d", &tmpVal);
|
||||||
|
// TODO : ...
|
||||||
|
EGE_VERBOSE(" illum " << tmpVal);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"map_Kd ",7)) {
|
||||||
|
material->setTexture0(fileName.getRelativeFolder() + &inputDataLine[7]);
|
||||||
|
EGE_VERBOSE(" Texture " << &inputDataLine[7]);
|
||||||
|
} else if(0 == strncmp(inputDataLine,"renderMode ",11)) {
|
||||||
|
ewol::openGL::renderMode mode;
|
||||||
|
etk::from_string(mode, &inputDataLine[11]);
|
||||||
|
material->setRenderMode(mode);
|
||||||
|
EGE_VERBOSE(" Texture " << mode);
|
||||||
|
} else {
|
||||||
|
EGE_ERROR("unknow material property ... : '" << inputDataLine << "'");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// unknow ...
|
||||||
|
EGE_WARNING("Unknow type of line == > jump end of line ... ");
|
||||||
|
jumpEndLine(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add last material ...
|
||||||
|
if( materialName != ""
|
||||||
|
&& material!=nullptr) {
|
||||||
|
m_materials.add(materialName, material);
|
||||||
|
materialName = "";
|
||||||
|
material.reset();
|
||||||
|
}
|
||||||
|
EGE_VERBOSE("Stop parsing Mesh file");
|
||||||
|
|
||||||
|
fileName.fileClose();
|
||||||
|
generateVBO();
|
||||||
|
return true;
|
||||||
|
}
|
80
ege/resource/MeshGird.cpp
Normal file
80
ege/resource/MeshGird.cpp
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license BSD v3 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ege/debug.h>
|
||||||
|
#include <ege/resource/Mesh.h>
|
||||||
|
|
||||||
|
std::shared_ptr<ege::resource::Mesh> ege::resource::Mesh::createGrid(int32_t _lineCount, const vec3& _position, float _size, const std::string& _materialName) {
|
||||||
|
std::shared_ptr<ege::resource::Mesh> out = ege::resource::Mesh::create("---", "DATA:color3.prog");
|
||||||
|
float lineSize = 0.1f;
|
||||||
|
if (out != nullptr) {
|
||||||
|
std::shared_ptr<ege::Material> material = std::make_shared<ege::Material>();
|
||||||
|
// set the element material properties :
|
||||||
|
material->setAmbientFactor(vec4(1,1,1,1));
|
||||||
|
material->setDiffuseFactor(vec4(0,0,0,1));
|
||||||
|
material->setSpecularFactor(vec4(0,0,0,1));
|
||||||
|
material->setShininess(1);
|
||||||
|
material->setRenderMode(ewol::openGL::renderLine);
|
||||||
|
//material->setRenderMode(ewol::openGL::renderPoint);
|
||||||
|
out->addMaterial(_materialName, material);
|
||||||
|
|
||||||
|
out->addFaceIndexing(_materialName);
|
||||||
|
// create X lines
|
||||||
|
for (int32_t iii=-_lineCount; iii<=_lineCount; ++iii) {
|
||||||
|
if (iii==0) {
|
||||||
|
out->addLine(_materialName, _position+vec3(-_lineCount,0,0)*_size, _position+vec3(_lineCount+1,0,0)*_size, etk::color::red);
|
||||||
|
out->addLine(_materialName, _position+vec3(_lineCount+1.0f,0,0)*_size, _position+vec3(_lineCount+0.5f,0.5f,0)*_size, etk::color::red);
|
||||||
|
out->addLine(_materialName, _position+vec3(_lineCount+1.0f,0,0)*_size, _position+vec3(_lineCount+0.5f,-0.5f,0)*_size, etk::color::red);
|
||||||
|
out->addLine(_materialName, _position+vec3(_lineCount+1.0f,0,0)*_size, _position+vec3(_lineCount+0.5f,0,0.5f)*_size, etk::color::red);
|
||||||
|
out->addLine(_materialName, _position+vec3(_lineCount+1.0f,0,0)*_size, _position+vec3(_lineCount+0.5f,0,-0.5f)*_size, etk::color::red);
|
||||||
|
} else {
|
||||||
|
out->addLine(_materialName, _position+vec3(-_lineCount,iii,0)*_size, _position+vec3(_lineCount,iii,0)*_size, etk::color::gray);
|
||||||
|
}
|
||||||
|
//out->addPoint(_materialName, vec3(-_lineCount,iii,0), etk::color::white);
|
||||||
|
//out->addPoint(_materialName, vec3(_lineCount,iii,0), etk::color::white);
|
||||||
|
}
|
||||||
|
// create Y lines
|
||||||
|
for (int32_t iii=-_lineCount; iii<=_lineCount; ++iii) {
|
||||||
|
if (iii==0) {
|
||||||
|
out->addLine(_materialName, _position+vec3(0,-_lineCount,0)*_size, _position+vec3(0,_lineCount+1,0)*_size, etk::color::green);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,_lineCount+1.0f,0)*_size, _position+vec3(0.5f,_lineCount+0.5f,0)*_size, etk::color::green);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,_lineCount+1.0f,0)*_size, _position+vec3(-0.5f,_lineCount+0.5f,0)*_size, etk::color::green);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,_lineCount+1.0f,0)*_size, _position+vec3(0,_lineCount+0.5f,0.5f)*_size, etk::color::green);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,_lineCount+1.0f,0)*_size, _position+vec3(0,_lineCount+0.5f,-0.5f)*_size, etk::color::green);
|
||||||
|
} else {
|
||||||
|
out->addLine(_materialName, _position+vec3(iii,-_lineCount,0)*_size, _position+vec3(iii,_lineCount,0)*_size, etk::color::gray);
|
||||||
|
}
|
||||||
|
//out->addPoint(_materialName, vec3(iii,-_lineCount,0), etk::color::white);
|
||||||
|
//out->addPoint(_materialName, vec3(iii,_lineCount,0), etk::color::white);
|
||||||
|
}
|
||||||
|
// create Z lines
|
||||||
|
for (int32_t iii=-_lineCount; iii<=_lineCount; ++iii) {
|
||||||
|
if (iii==0) {
|
||||||
|
out->addLine(_materialName, _position+vec3(0,0,-_lineCount)*_size, _position+vec3(0,0,_lineCount+1)*_size, etk::color::blue);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,0,_lineCount+1)*_size, _position+vec3(0.5f,0,_lineCount+0.5f)*_size, etk::color::blue);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,0,_lineCount+1)*_size, _position+vec3(-0.5f,0,_lineCount+0.5f)*_size, etk::color::blue);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,0,_lineCount+1)*_size, _position+vec3(0,0.5f,_lineCount+0.5f)*_size, etk::color::blue);
|
||||||
|
out->addLine(_materialName, _position+vec3(0,0,_lineCount+1)*_size, _position+vec3(0,-0.5f,_lineCount+0.5f)*_size, etk::color::blue);
|
||||||
|
} else {
|
||||||
|
std::vector<vec3> list;
|
||||||
|
list.push_back(_position+vec3(-1,-1,iii)*_size);
|
||||||
|
list.push_back(_position+vec3(1,-1,iii)*_size);
|
||||||
|
list.push_back(_position+vec3(1,1,iii)*_size);
|
||||||
|
list.push_back(_position+vec3(-1,1,iii)*_size);
|
||||||
|
list.push_back(_position+vec3(-1,-1,iii)*_size);
|
||||||
|
out->addLines(_materialName, list, etk::color::gray);
|
||||||
|
}
|
||||||
|
//out->addPoint(_materialName, vec3(iii,-_lineCount,0), etk::color::white);
|
||||||
|
//out->addPoint(_materialName, vec3(iii,_lineCount,0), etk::color::white);
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate the VBO
|
||||||
|
out->generateVBO();
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
134
ege/resource/MeshObj.cpp
Normal file
134
ege/resource/MeshObj.cpp
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license BSD v3 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ege/debug.h>
|
||||||
|
#include <ege/resource/Mesh.h>
|
||||||
|
|
||||||
|
|
||||||
|
bool ege::resource::Mesh::loadOBJ(const std::string& _fileName) {
|
||||||
|
m_normalMode = normalModeNone;
|
||||||
|
#if 0
|
||||||
|
etk::FSNode fileName(_fileName);
|
||||||
|
// get the fileSize ...
|
||||||
|
int32_t size = fileName.fileSize();
|
||||||
|
if (size == 0 ) {
|
||||||
|
EGE_ERROR("No data in the file named=\"" << fileName << "\"");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(false == fileName.fileOpenRead() ) {
|
||||||
|
EGE_ERROR("Can not find the file name=\"" << fileName << "\"");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char inputDataLine[2048];
|
||||||
|
|
||||||
|
int32_t lineID = 0;
|
||||||
|
while (nullptr != fileName.fileGets(inputDataLine, 2048) )
|
||||||
|
{
|
||||||
|
lineID++;
|
||||||
|
if (inputDataLine[0] == 'v') {
|
||||||
|
if (inputDataLine[1] == 'n') {
|
||||||
|
// Vertice normal : vn 0.000000 0.000000 -1.000000
|
||||||
|
// we did not use normal == > we recalculated it if needed (some .obj does not export normal, then it is simple like this ...
|
||||||
|
// TODO : Use the normal provided ... => can be smooth or not ... (cf check "s 1")
|
||||||
|
} else if (inputDataLine[1] == 't') {
|
||||||
|
// Texture position : vt 0.748573 0.750412
|
||||||
|
vec2 vertex(0,0);
|
||||||
|
sscanf(&inputDataLine[3], "%f %f", &vertex.m_floats[0], &vertex.m_floats[1]);
|
||||||
|
m_listUV.push_back(vertex);
|
||||||
|
} else {
|
||||||
|
// Vertice position : v 1.000000 -1.000000 -1.000000
|
||||||
|
vec3 vertex(0,0,0);
|
||||||
|
sscanf(&inputDataLine[2], "%f %f %f", &vertex.m_floats[0], &vertex.m_floats[1], &vertex.m_floats[2] );
|
||||||
|
m_listVertex.push_back(vertex);
|
||||||
|
}
|
||||||
|
} else if (inputDataLine[0] == 'f') {
|
||||||
|
// face : f 5/1/1 1/2/1 4/3/1*
|
||||||
|
uint32_t vertexIndex[4], uvIndex[4], normalIndex[4];
|
||||||
|
bool quadMode = true;
|
||||||
|
int32_t matches = sscanf(&inputDataLine[2], "%d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n",
|
||||||
|
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
||||||
|
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
||||||
|
&vertexIndex[2], &uvIndex[2], &normalIndex[2],
|
||||||
|
&vertexIndex[3], &uvIndex[3], &normalIndex[3] );
|
||||||
|
if (12 != matches){
|
||||||
|
// no normal mode :
|
||||||
|
matches = sscanf(&inputDataLine[2], "%d/%d %d/%d %d/%d %d/%d\n",
|
||||||
|
&vertexIndex[0], &uvIndex[0],
|
||||||
|
&vertexIndex[1], &uvIndex[1],
|
||||||
|
&vertexIndex[2], &uvIndex[2],
|
||||||
|
&vertexIndex[3], &uvIndex[3] );
|
||||||
|
if (8 != matches){
|
||||||
|
quadMode = false;
|
||||||
|
matches = sscanf(&inputDataLine[2], "%d/%d/%d %d/%d/%d %d/%d/%d\n",
|
||||||
|
&vertexIndex[0], &uvIndex[0], &normalIndex[0],
|
||||||
|
&vertexIndex[1], &uvIndex[1], &normalIndex[1],
|
||||||
|
&vertexIndex[2], &uvIndex[2], &normalIndex[2] );
|
||||||
|
if (9 != matches){
|
||||||
|
// no normal mode :
|
||||||
|
matches = sscanf(&inputDataLine[2], "%d/%d %d/%d %d/%d\n",
|
||||||
|
&vertexIndex[0], &uvIndex[0],
|
||||||
|
&vertexIndex[1], &uvIndex[1],
|
||||||
|
&vertexIndex[2], &uvIndex[2] );
|
||||||
|
if (6 != matches){
|
||||||
|
EGE_ERROR("Parsing error in the .obj files : " << fileName << " (l=" << lineID << ") in 'f' section : \"" << &inputDataLine[2] << "\" expected : %d/%d(/%d) %d/%d(/%d) %d/%d(/%d) (%d/%d(/%d)) () for option");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (true == quadMode) {
|
||||||
|
m_listFaces.push_back(Face(vertexIndex[0]-1, uvIndex[0]-1,
|
||||||
|
vertexIndex[1]-1, uvIndex[1]-1,
|
||||||
|
vertexIndex[2]-1, uvIndex[2]-1,
|
||||||
|
vertexIndex[3]-1, uvIndex[3]-1));
|
||||||
|
} else {
|
||||||
|
m_listFaces.push_back(Face(vertexIndex[0]-1, uvIndex[0]-1,
|
||||||
|
vertexIndex[1]-1, uvIndex[1]-1,
|
||||||
|
vertexIndex[2]-1, uvIndex[2]-1));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
EGE_DEBUG(" plop : " << tmpFace.m_nbElement << " ? " << m_listFaces[m_listFaces.size()-1].m_nbElement);
|
||||||
|
EGE_DEBUG(" : " << tmpFace.m_vertex[0] << " ? " << m_listFaces[m_listFaces.size()-1].m_vertex[0]);
|
||||||
|
EGE_DEBUG(" : " << tmpFace.m_uv[0] << " ? " << m_listFaces[m_listFaces.size()-1].m_uv[0]);
|
||||||
|
*/
|
||||||
|
} else if (inputDataLine[0] == 's') {
|
||||||
|
// ??? : s off
|
||||||
|
} else if (inputDataLine[0] == '#') {
|
||||||
|
// comment
|
||||||
|
// nothing to do ... just go to the new line ...
|
||||||
|
} else if( inputDataLine[0] == 'u'
|
||||||
|
&& inputDataLine[1] == 's'
|
||||||
|
&& inputDataLine[2] == 'e'
|
||||||
|
&& inputDataLine[3] == 'm'
|
||||||
|
&& inputDataLine[4] == 't'
|
||||||
|
&& inputDataLine[5] == 'l' ) {
|
||||||
|
// Use Material : usemtl imageName.xxx
|
||||||
|
while( inputDataLine[strlen(inputDataLine)-1] == '\n'
|
||||||
|
|| inputDataLine[strlen(inputDataLine)-1] == '\r'
|
||||||
|
|| inputDataLine[strlen(inputDataLine)-1] == ' ') {
|
||||||
|
if (1 == strlen(inputDataLine) ){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
inputDataLine[strlen(inputDataLine)-1] = '\0';
|
||||||
|
}
|
||||||
|
std::string tmpVal(&inputDataLine[7]);
|
||||||
|
setTexture(fileName.getRelativeFolder() + tmpVal);
|
||||||
|
} else if( inputDataLine[0] == 'm'
|
||||||
|
&& inputDataLine[1] == 't'
|
||||||
|
&& inputDataLine[2] == 'l'
|
||||||
|
&& inputDataLine[3] == 'l'
|
||||||
|
&& inputDataLine[4] == 'i'
|
||||||
|
&& inputDataLine[5] == 'b' ) {
|
||||||
|
// ???? : mtllib cube.mtl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fileName.fileClose();
|
||||||
|
generateVBO();
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
@ -30,6 +30,9 @@ def create(target):
|
|||||||
'ege/widget/Scene.cpp',
|
'ege/widget/Scene.cpp',
|
||||||
'ege/Environement.cpp',
|
'ege/Environement.cpp',
|
||||||
'ege/resource/Mesh.cpp',
|
'ege/resource/Mesh.cpp',
|
||||||
|
'ege/resource/MeshEmf.cpp',
|
||||||
|
'ege/resource/MeshGird.cpp',
|
||||||
|
'ege/resource/MeshObj.cpp',
|
||||||
'ege/resource/ParticuleMesh.cpp',
|
'ege/resource/ParticuleMesh.cpp',
|
||||||
'ege/resource/tools/icoSphere.cpp',
|
'ege/resource/tools/icoSphere.cpp',
|
||||||
'ege/resource/tools/isoSphere.cpp',
|
'ege/resource/tools/isoSphere.cpp',
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Camera position sample example
|
99
sample/CameraPosition/appl/Windows.cpp
Normal file
99
sample/CameraPosition/appl/Windows.cpp
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ewol/ewol.h>
|
||||||
|
#include <appl/debug.h>
|
||||||
|
#include <appl/Windows.h>
|
||||||
|
#include <ewol/widget/Label.h>
|
||||||
|
#include <ewol/object/Manager.h>
|
||||||
|
#include <ege/widget/Scene.h>
|
||||||
|
#include <ege/camera/View.h>
|
||||||
|
#include <etk/tool.h>
|
||||||
|
#include <ege/elements/ElementBase.h>
|
||||||
|
#include <ege/elements/ElementPhysic.h>
|
||||||
|
|
||||||
|
#undef __class__
|
||||||
|
#define __class__ "Windows"
|
||||||
|
|
||||||
|
appl::Windows::Windows() {
|
||||||
|
addObjectType("appl::Windows");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void appl::Windows::init() {
|
||||||
|
ewol::widget::Windows::init();
|
||||||
|
setTitle("example ege : CameraPosirion");
|
||||||
|
|
||||||
|
getObjectManager().periodicCall.bind(shared_from_this(), &appl::Windows::onCallbackPeriodicUpdateCamera);
|
||||||
|
|
||||||
|
m_env = ege::Environement::create();
|
||||||
|
// Create basic Camera
|
||||||
|
m_camera = std::make_shared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0));
|
||||||
|
m_env->addCamera("basic", m_camera);
|
||||||
|
|
||||||
|
std::shared_ptr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create(m_env);
|
||||||
|
if (tmpWidget == nullptr) {
|
||||||
|
APPL_ERROR("Can not allocate widget ==> display might be in error");
|
||||||
|
} else {
|
||||||
|
tmpWidget->setExpand(bvec2(true,true));
|
||||||
|
tmpWidget->setFill(bvec2(true,true));
|
||||||
|
tmpWidget->setCamera("basic");
|
||||||
|
setSubWidget(tmpWidget);
|
||||||
|
}
|
||||||
|
// Create an external box :
|
||||||
|
std::shared_ptr<ege::resource::Mesh> myMesh = ege::resource::Mesh::create("---", "DATA:texturedNoMaterial.prog");
|
||||||
|
if (myMesh != nullptr) {
|
||||||
|
std::shared_ptr<ege::Material> material = std::make_shared<ege::Material>();
|
||||||
|
// set the element material properties :
|
||||||
|
material->setAmbientFactor(vec4(1,1,1,1));
|
||||||
|
material->setDiffuseFactor(vec4(0,0,0,1));
|
||||||
|
material->setSpecularFactor(vec4(0,0,0,1));
|
||||||
|
material->setShininess(1);
|
||||||
|
material->setTexture0(""); //"
|
||||||
|
myMesh->addMaterial("basics", material);
|
||||||
|
// 1024 == > 1<<9
|
||||||
|
// 2048 == > 1<<10
|
||||||
|
// 4096 == > 1<<11
|
||||||
|
int32_t size = 1<<11;
|
||||||
|
material->setImageSize(ivec2(size,size));
|
||||||
|
egami::Image* myImage = material->get();
|
||||||
|
if (nullptr == myImage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
myImage->clear(etk::color::black);
|
||||||
|
ivec2 tmpPos;
|
||||||
|
for (int32_t iii=0; iii<6000; iii++) {
|
||||||
|
tmpPos.setValue(etk::tool::frand(0,size), etk::tool::frand(0,size)) ;
|
||||||
|
myImage->set(tmpPos, etk::color::white);
|
||||||
|
}
|
||||||
|
material->flush();
|
||||||
|
// basis on cube :
|
||||||
|
myMesh->createViewBox("basics", 1000/* distance */);
|
||||||
|
// generate the VBO
|
||||||
|
myMesh->generateVBO();
|
||||||
|
m_env->addStaticMeshToDraw(myMesh);
|
||||||
|
}
|
||||||
|
myMesh = ege::resource::Mesh::createGrid(10, vec3(0,0,0), 5);
|
||||||
|
if (myMesh != nullptr) {
|
||||||
|
m_env->addStaticMeshToDraw(myMesh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event) {
|
||||||
|
static float offset = 0;
|
||||||
|
offset += 0.01;
|
||||||
|
static float offset2 = 0;
|
||||||
|
offset2 += 0.003;
|
||||||
|
m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
33
sample/CameraPosition/appl/Windows.h
Normal file
33
sample/CameraPosition/appl/Windows.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __APPL_WINDOWS_H__
|
||||||
|
#define __APPL_WINDOWS_H__
|
||||||
|
|
||||||
|
#include <ewol/widget/Windows.h>
|
||||||
|
#include <ege/Environement.h>
|
||||||
|
#include <ege/camera/View.h>
|
||||||
|
|
||||||
|
namespace appl {
|
||||||
|
class Windows : public ewol::widget::Windows {
|
||||||
|
private:
|
||||||
|
std::shared_ptr<ege::Environement> m_env;
|
||||||
|
std::shared_ptr<ege::camera::View> m_camera;
|
||||||
|
protected:
|
||||||
|
Windows();
|
||||||
|
void init();
|
||||||
|
public:
|
||||||
|
DECLARE_FACTORY(Windows);
|
||||||
|
virtual ~Windows() { };
|
||||||
|
private:
|
||||||
|
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
15
sample/CameraPosition/appl/debug.cpp
Normal file
15
sample/CameraPosition/appl/debug.cpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <appl/debug.h>
|
||||||
|
|
||||||
|
int32_t appl::getLogId() {
|
||||||
|
static int32_t g_val = etk::log::registerInstance("GP-spaceShip");
|
||||||
|
return g_val;
|
||||||
|
}
|
52
sample/CameraPosition/appl/debug.h
Normal file
52
sample/CameraPosition/appl/debug.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __APPL_DEBUG_H__
|
||||||
|
#define __APPL_DEBUG_H__
|
||||||
|
|
||||||
|
#include <etk/log.h>
|
||||||
|
|
||||||
|
namespace appl {
|
||||||
|
int32_t getLogId();
|
||||||
|
};
|
||||||
|
// TODO : Review this problem of multiple intanciation of "std::stringbuf sb"
|
||||||
|
#define APPL_BASE(info,data) \
|
||||||
|
do { \
|
||||||
|
if (info <= etk::log::getLevel(appl::getLogId())) { \
|
||||||
|
std::stringbuf sb; \
|
||||||
|
std::ostream tmpStream(&sb); \
|
||||||
|
tmpStream << data; \
|
||||||
|
etk::log::logStream(appl::getLogId(), info, __LINE__, __class__, __func__, tmpStream); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define APPL_CRITICAL(data) APPL_BASE(1, data)
|
||||||
|
#define APPL_ERROR(data) APPL_BASE(2, data)
|
||||||
|
#define APPL_WARNING(data) APPL_BASE(3, data)
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define APPL_INFO(data) APPL_BASE(4, data)
|
||||||
|
#define APPL_DEBUG(data) APPL_BASE(5, data)
|
||||||
|
#define APPL_VERBOSE(data) APPL_BASE(6, data)
|
||||||
|
#define APPL_TODO(data) APPL_BASE(4, "TODO : " << data)
|
||||||
|
#else
|
||||||
|
#define APPL_INFO(data) do { } while(false)
|
||||||
|
#define APPL_DEBUG(data) do { } while(false)
|
||||||
|
#define APPL_VERBOSE(data) do { } while(false)
|
||||||
|
#define APPL_TODO(data) do { } while(false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define APPL_ASSERT(cond,data) \
|
||||||
|
do { \
|
||||||
|
if (!(cond)) { \
|
||||||
|
APPL_CRITICAL(data); \
|
||||||
|
assert(!#cond); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif
|
57
sample/CameraPosition/appl/main.cpp
Normal file
57
sample/CameraPosition/appl/main.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <etk/types.h>
|
||||||
|
#include <ewol/ewol.h>
|
||||||
|
#include <ewol/context/commandLine.h>
|
||||||
|
|
||||||
|
#include <appl/debug.h>
|
||||||
|
#include <appl/Windows.h>
|
||||||
|
#include <ewol/object/Object.h>
|
||||||
|
#include <ewol/widget/Manager.h>
|
||||||
|
#include <ewol/context/Context.h>
|
||||||
|
|
||||||
|
|
||||||
|
class MainApplication : public ewol::context::Application {
|
||||||
|
public:
|
||||||
|
bool init(ewol::Context& _context, size_t _initId) {
|
||||||
|
APPL_INFO("==> Init APPL (START) [" << ewol::getBoardType() << "] (" << ewol::getCompilationMode() << ")");
|
||||||
|
|
||||||
|
// TODO : Remove this : Move if in the windows properties
|
||||||
|
_context.setSize(vec2(800, 600));
|
||||||
|
|
||||||
|
// select internal data for font ...
|
||||||
|
_context.getFontDefault().setUseExternal(true);
|
||||||
|
_context.getFontDefault().set("FreeSerif;DejaVuSansMono", 19);
|
||||||
|
|
||||||
|
std::shared_ptr<ewol::widget::Windows> basicWindows = appl::Windows::create();
|
||||||
|
// create the specific windows
|
||||||
|
_context.setWindows(basicWindows);
|
||||||
|
APPL_INFO("==> Init APPL (END)");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unInit(ewol::Context& _context) {
|
||||||
|
APPL_INFO("==> Un-Init APPL (START)");
|
||||||
|
// nothing to do ...
|
||||||
|
APPL_INFO("==> Un-Init APPL (END)");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Main of the program (This can be set in every case, but it is not used in Andoid...).
|
||||||
|
* @param std IO
|
||||||
|
* @return std IO
|
||||||
|
*/
|
||||||
|
int main(int _argc, const char *_argv[]) {
|
||||||
|
// second possibility
|
||||||
|
return ewol::run(new MainApplication(), _argc, _argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
14
sample/CameraPosition/appl/main.h
Normal file
14
sample/CameraPosition/appl/main.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
*
|
||||||
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
||||||
|
*
|
||||||
|
* @license APACHE-2 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __APPL_MAIN_H__
|
||||||
|
#define __APPL_MAIN_H__
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
BIN
sample/CameraPosition/data/texture_mars.png
Normal file
BIN
sample/CameraPosition/data/texture_mars.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 938 KiB |
40
sample/CameraPosition/lutin_egeCameraPosition.py
Normal file
40
sample/CameraPosition/lutin_egeCameraPosition.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import lutinModule as module
|
||||||
|
import lutinTools as tools
|
||||||
|
import lutinDebug as debug
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def get_desc():
|
||||||
|
return "ege sample : CameraPisition"
|
||||||
|
|
||||||
|
def create(target):
|
||||||
|
# module name is 'edn' and type binary.
|
||||||
|
myModule = module.Module(__file__, 'egeCameraPosition', 'PACKAGE')
|
||||||
|
|
||||||
|
myModule.add_src_file([
|
||||||
|
'appl/debug.cpp',
|
||||||
|
'appl/main.cpp',
|
||||||
|
'appl/Windows.cpp'
|
||||||
|
])
|
||||||
|
|
||||||
|
myModule.add_module_depend('ege')
|
||||||
|
|
||||||
|
myModule.add_path(tools.get_current_path(__file__))
|
||||||
|
|
||||||
|
myModule.copy_folder("data/*")
|
||||||
|
|
||||||
|
# set the package properties :
|
||||||
|
myModule.pkg_set("VERSION", "0.0.0")
|
||||||
|
myModule.pkg_set("VERSION_CODE", "0")
|
||||||
|
myModule.pkg_set("COMPAGNY_TYPE", "org")
|
||||||
|
myModule.pkg_set("COMPAGNY_NAME", "ege")
|
||||||
|
myModule.pkg_set("MAINTAINER", ["noOne <no.one@noreplay.com>"])
|
||||||
|
myModule.pkg_set("SECTION", ["Game"])
|
||||||
|
myModule.pkg_set("PRIORITY", "optional")
|
||||||
|
myModule.pkg_set("DESCRIPTION", "ege sample : MeshCreator")
|
||||||
|
myModule.pkg_set("NAME", "egeMeshCreator")
|
||||||
|
|
||||||
|
# add the currrent module at the
|
||||||
|
return myModule
|
||||||
|
|
@ -25,39 +25,7 @@ appl::Windows::Windows() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static std::shared_ptr<ege::resource::Mesh> createGrid(int32_t _lineCount) {
|
|
||||||
std::shared_ptr<ege::resource::Mesh> out = ege::resource::Mesh::create("---", "DATA:color3.prog");
|
|
||||||
float lineSize = 0.1f;
|
|
||||||
if (out != nullptr) {
|
|
||||||
std::shared_ptr<ege::Material> material = std::make_shared<ege::Material>();
|
|
||||||
// set the element material properties :
|
|
||||||
material->setAmbientFactor(vec4(1,1,1,1));
|
|
||||||
material->setDiffuseFactor(vec4(0,0,0,1));
|
|
||||||
material->setSpecularFactor(vec4(0,0,0,1));
|
|
||||||
material->setShininess(1);
|
|
||||||
material->setRenderMode(ewol::openGL::renderLine);
|
|
||||||
//material->setRenderMode(ewol::openGL::renderPoint);
|
|
||||||
out->addMaterial("basics", material);
|
|
||||||
|
|
||||||
out->addFaceIndexing("basics");
|
|
||||||
// create horizontal lines
|
|
||||||
for (int32_t iii=-_lineCount; iii<=_lineCount; ++iii) {
|
|
||||||
out->addLine("basics", vec3(-_lineCount,iii,0), vec3(_lineCount,iii,0), etk::color::white);
|
|
||||||
//out->addPoint("basics", vec3(-_lineCount,iii,0), etk::color::white);
|
|
||||||
//out->addPoint("basics", vec3(_lineCount,iii,0), etk::color::white);
|
|
||||||
}
|
|
||||||
// create vertical lines
|
|
||||||
for (int32_t iii=-_lineCount; iii<=_lineCount; ++iii) {
|
|
||||||
out->addLine("basics", vec3(iii,-_lineCount,0), vec3(iii,_lineCount,0), etk::color::white);
|
|
||||||
//out->addPoint("basics", vec3(iii,-_lineCount,0), etk::color::white);
|
|
||||||
//out->addPoint("basics", vec3(iii,_lineCount,0), etk::color::white);
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate the VBO
|
|
||||||
out->generateVBO();
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void appl::Windows::init() {
|
void appl::Windows::init() {
|
||||||
@ -113,7 +81,7 @@ void appl::Windows::init() {
|
|||||||
myMesh->generateVBO();
|
myMesh->generateVBO();
|
||||||
m_env->addStaticMeshToDraw(myMesh);
|
m_env->addStaticMeshToDraw(myMesh);
|
||||||
}
|
}
|
||||||
myMesh = createGrid(10);
|
myMesh = ege::resource::Mesh::createGrid(10, vec3(0,0,0), 5);
|
||||||
if (myMesh != nullptr) {
|
if (myMesh != nullptr) {
|
||||||
m_env->addStaticMeshToDraw(myMesh);
|
m_env->addStaticMeshToDraw(myMesh);
|
||||||
}
|
}
|
||||||
@ -141,11 +109,13 @@ void appl::Windows::init() {
|
|||||||
|
|
||||||
|
|
||||||
void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event) {
|
void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event) {
|
||||||
|
/*
|
||||||
static float offset = 0;
|
static float offset = 0;
|
||||||
offset += 0.01;
|
offset += 0.01;
|
||||||
static float offset2 = 0;
|
static float offset2 = 0;
|
||||||
offset2 += 0.003;
|
offset2 += 0.003;
|
||||||
m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2))+vec3(50,0,0));
|
m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2))+vec3(50,0,0));
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user