NFF spheres are working now.

Added additional NFF test model.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@128 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
aramis_acg 2008-09-10 20:37:24 +00:00
parent 96f2b0b536
commit 1a55e7e8f1
5 changed files with 59 additions and 17 deletions

View File

@ -90,14 +90,15 @@ bool NFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) const
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bool GetNextLine(const char*& buffer, char out[4096]) bool GetNextLine(const char*& buffer, char out[4096])
{ {
if ('\0' == *buffer)return false;
char* _out = out; char* _out = out;
char* const end = _out+4096; char* const end = _out+4096;
while (!IsLineEnd( *buffer ) && _out < end) while (!IsLineEnd( *buffer ) && _out < end)
*_out++ = *buffer++; *_out++ = *buffer++;
*_out = '\0'; *_out = '\0';
if ('\0' == *buffer)return false; if ('\0' != *buffer)while (IsLineEnd( *buffer ))++buffer;
while (IsLineEnd( *buffer ))++buffer;
return true; return true;
} }
@ -150,6 +151,9 @@ void NFFImporter::InternReadFile( const std::string& pFile,
ShadingInfo s; // current material info ShadingInfo s; // current material info
// degree of tesselation
unsigned int iTesselation = 4;
char line[4096]; char line[4096];
const char* sz; const char* sz;
unsigned int sphere = 0,cylinder = 0,cone = 0,numNamed = 0; unsigned int sphere = 0,cylinder = 0,cone = 0,numNamed = 0;
@ -182,25 +186,26 @@ void NFFImporter::InternReadFile( const std::string& pFile,
SkipSpaces(sz,&sz); SkipSpaces(sz,&sz);
m = strtol10(sz); m = strtol10(sz);
out->faces.push_back(m); out->vertices.reserve(out->vertices.size()+m);
for (unsigned int n = 0; n < m;++n) for (unsigned int n = 0; n < m;++n)
{ {
if(!GetNextLine(buffer,line)) if(!GetNextLine(buffer,line))
{ {
DefaultLogger::get()->error("NFF: Unexpected EOF was encountered"); DefaultLogger::get()->error("NFF: Unexpected EOF was encountered");
break; continue;
} }
aiVector3D v; sz = &line[0]; aiVector3D v; sz = &line[0];
AI_NFF_PARSE_TRIPLE(v); AI_NFF_PARSE_TRIPLE(v);
out->vertices.push_back(v); out->vertices.push_back(v);
if (&meshesWithNormals.back() == out) if ('p' == line[1])
{ {
AI_NFF_PARSE_TRIPLE(v); AI_NFF_PARSE_TRIPLE(v);
out->normals.push_back(v); out->normals.push_back(v);
} }
} }
out->faces.push_back(m);
} }
// 'f' - shading information block // 'f' - shading information block
else if ('f' == line[0] && IsSpace(line[1])) else if ('f' == line[0] && IsSpace(line[1]))
@ -254,12 +259,18 @@ void NFFImporter::InternReadFile( const std::string& pFile,
AI_NFF_PARSE_SHAPE_INFORMATION(); AI_NFF_PARSE_SHAPE_INFORMATION();
// generate the sphere - it consists of simple triangles // generate the sphere - it consists of simple triangles
StandardShapes::MakeSphere(aiVector3D(), radius, 500.0f, currentMesh.vertices); StandardShapes::MakeSphere(aiVector3D(), radius, iTesselation, currentMesh.vertices);
currentMesh.faces.resize(currentMesh.vertices.size(),3); currentMesh.faces.resize(currentMesh.vertices.size()/3,3);
// generate a name for the mesh // generate a name for the mesh
::sprintf(currentMesh.name,"sphere_%i",sphere++); ::sprintf(currentMesh.name,"sphere_%i",sphere++);
} }
// 'tess' - tesselation
else if (!strncmp(line,"tess",4) && IsSpace(line[4]))
{
sz = &line[5];SkipSpaces(&sz);
iTesselation = strtol10(sz);
}
// 'c' - cone // 'c' - cone
else if ('c' == line[0] && IsSpace(line[1])) else if ('c' == line[0] && IsSpace(line[1]))
{ {
@ -280,8 +291,8 @@ void NFFImporter::InternReadFile( const std::string& pFile,
center1 = -center2; center1 = -center2;
// generate the cone - it consists of simple triangles // generate the cone - it consists of simple triangles
StandardShapes::MakeCone(center1, radius1, center2, radius2, 500.0f, currentMesh.vertices); StandardShapes::MakeCone(center1, radius1, center2, radius2, iTesselation, currentMesh.vertices);
currentMesh.faces.resize(currentMesh.vertices.size(),3); currentMesh.faces.resize(currentMesh.vertices.size()/3,3);
// generate a name for the mesh // generate a name for the mesh
if (radius1 != radius2) if (radius1 != radius2)
@ -384,7 +395,9 @@ void NFFImporter::InternReadFile( const std::string& pFile,
// generate a material for the mesh // generate a material for the mesh
MaterialHelper* pcMat = (MaterialHelper*)(pScene-> MaterialHelper* pcMat = (MaterialHelper*)(pScene->
mMaterials[m++] = new MaterialHelper()); mMaterials[m] = new MaterialHelper());
mesh->mMaterialIndex = m++;
aiString s; aiString s;
s.Set(AI_DEFAULT_MATERIAL_NAME); s.Set(AI_DEFAULT_MATERIAL_NAME);

Binary file not shown.

View File

@ -69,14 +69,33 @@ public:
std::vector<aiVector3D>& positions); std::vector<aiVector3D>& positions);
/** @brief Generates a dodecahedron
*
* @param center Center point of the dodecahedron
* @param length Face length of the dodecahedron
* @param positions Receives output triangles.
*/
static void MakeDodecahedron(aiVector3D& center,float length,
std::vector<aiVector3D>& positions);
/** @brief Generates an octahedron
*
* @param center Center point of the octahedron
* @param length Face length of the octahedron
* @param positions Receives output triangles.
*/
static void MakeOctahedron(aiVector3D& center,float length,
std::vector<aiVector3D>& positions);
/** @brief Generates a sphere /** @brief Generates a sphere
* *
* @param center Center point of the sphere * @param center Center point of the sphere
* @param radius Radius of the sphere * @param radius Radius of the sphere
* @param tess Number of triangles in the equator line of the sphere * @param tess Number of subdivions - 0 generates a octahedron
* @param positions Receives output triangles. * @param positions Receives output triangles.
*/ */
static void MakeSphere(aiVector3D& center,float radius,float tess, static void MakeSphere(aiVector3D& center,float radius,unsigned int tess,
std::vector<aiVector3D>& positions); std::vector<aiVector3D>& positions);
/** @brief Generates a cone or a cylinder, either opened or closed. /** @brief Generates a cone or a cylinder, either opened or closed.
@ -100,12 +119,12 @@ public:
* @param radius1 First radius * @param radius1 First radius
* @param center2 Second center point * @param center2 Second center point
* @param radius2 Second radius * @param radius2 Second radius
* @param tess Number of triangles per circle * @param tess Number of subdivisions
* @param bOpened true for an open cone/cylinder. * @param bOpened true for an open cone/cylinder.
* @param positions Receives output triangles. * @param positions Receives output triangles.
*/ */
static void MakeCone(aiVector3D& center1,float radius1, static void MakeCone(aiVector3D& center1,float radius1,
aiVector3D& center2,float radius2,float tess, aiVector3D& center2,float radius2,unsigned int tess,
std::vector<aiVector3D>& positions,bool bOpened = false); std::vector<aiVector3D>& positions,bool bOpened = false);
/** @brief Generates a flat circle /** @brief Generates a flat circle
@ -119,7 +138,7 @@ public:
* @param positions Receives output triangles. * @param positions Receives output triangles.
*/ */
static void MakeCircle(aiVector3D& center, aiVector3D& normal, static void MakeCircle(aiVector3D& center, aiVector3D& normal,
float radius, float tess, float radius, unsigned int tess,
std::vector<aiVector3D>& positions); std::vector<aiVector3D>& positions);
}; };

View File

@ -0,0 +1,10 @@
# a centered sphere
s 0 0 0 5
# a polgyon that should not be visible
p 4
5 0 0
0 -5 0
-5 0 0
0 5 0

View File

@ -2,7 +2,7 @@
#default color #default color
# A simple sphere # A simple sphere
s 5.0 5.0 5.0 10.0 s 5.0 5.0 5.0 3.0
#blue #blue
f 0.0 0.0 1.0 0 1 1 f 0.0 0.0 1.0 0 1 1