L3DS Class Reference

#include <OSG3DSLoader.h>

Inheritance diagram for L3DS:

LImporter List of all members.

Public Member Functions

 L3DS ()
 L3DS (const char *filename)
virtual ~L3DS ()
virtual bool Load (std::istream &is)
virtual bool Load (const char *filename)
uint GetMeshCount ()
uint GetLightCount ()
uint GetMaterialCount ()
uint GetCameraCount ()
LMeshGetMesh (uint index)
LCameraGetCamera (uint index)
LLightGetLight (uint index)
LMaterialGetMaterial (uint index)
LMaterialFindMaterial (const std::string &name)
LMeshFindMesh (const std::string &name)
LLightFindCamera (const std::string &name)
LLightFindLight (const std::string &name)
void SetOptimizationLevel (LOptimizationLevel value)
LOptimizationLevel GetOptimizationLevel ()

Protected Member Functions

short ReadShort ()
int ReadInt ()
char ReadChar ()
float ReadFloat ()
byte ReadByte ()
int ReadASCIIZ (char *buf, int max_count)
void Seek (int offset, int origin)
uint Pos ()
LChunk ReadChunk ()
bool FindChunk (LChunk &target, const LChunk &parent)
void SkipChunk (const LChunk &chunk)
void GotoChunk (const LChunk &chunk)
LColor3 ReadColor (const LChunk &chunk)
float ReadPercentage (const LChunk &chunk)
bool Read3DS ()
void ReadLight (const LChunk &parent)
void ReadCamera (const LChunk &parent)
void ReadMesh (const LChunk &parent)
void ReadFaceList (const LChunk &chunk, LMesh &mesh)
void ReadMaterial (const LChunk &parent)
void ReadMap (const LChunk &chunk, LMap &map)
void ReadKeyframeData (const LChunk &parent)
long ReadKeyheader ()
virtual void Clear ()

Protected Attributes

char m_objName [100]
bool m_eof
unsigned char * m_buffer
uint m_bufferSize
uint m_pos
std::vector< LCameram_cameras
std::vector< LLightm_lights
std::vector< LMeshm_meshes
std::vector< LMaterialm_materials
LOptimizationLevel m_optLevel

Detailed Description

Definition at line 467 of file OSG3DSLoader.h.


Constructor & Destructor Documentation

L3DS::L3DS (  ) 

Definition at line 1125 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

01126 : LImporter()
01127 {
01128     m_buffer = 0;
01129     m_bufferSize = 0;
01130     m_pos = 0;
01131     m_eof = false;
01132 }

L3DS::L3DS ( const char *  filename  ) 

Definition at line 1134 of file OSG3DSLoader.cpp.

References Load(), m_buffer, m_bufferSize, m_eof, and m_pos.

01135 : LImporter()
01136 {
01137     m_buffer = 0;
01138     m_bufferSize = 0;
01139     m_pos = 0;
01140     m_eof = false;
01141     Load(filename);
01142 }

L3DS::~L3DS (  )  [virtual]

Definition at line 1144 of file OSG3DSLoader.cpp.

References m_buffer, and m_bufferSize.

01145 {
01146     if (m_bufferSize > 0)
01147         free(m_buffer);
01148 }


Member Function Documentation

bool L3DS::Load ( std::istream &  is  )  [virtual]

Implements LImporter.

Definition at line 1150 of file OSG3DSLoader.cpp.

References LImporter::Clear(), m_buffer, m_bufferSize, and Read3DS().

Referenced by L3DS(), and OSG::A3DSSceneFileType::read().

01151 {
01152     // get length of file:
01153     is.seekg(0, std::ios::end);
01154     m_bufferSize = is.tellg();
01155     is.seekg(0, std::ios::beg);
01156 
01157     m_buffer = (unsigned char*) calloc(m_bufferSize, 1);
01158     if (m_buffer == 0)
01159     {
01160         fprintf(stderr, "L3DS::LoadFile - not enough memory (malloc failed)");
01161         return false;
01162     }
01163     is.read((char *) m_buffer, m_bufferSize);
01164     if(is.gcount() != m_bufferSize)
01165     {
01166         free(m_buffer);
01167         m_bufferSize = 0;
01168         fprintf(stderr, "L3DS::LoadFile - error reading from stream");
01169         return false;
01170     }
01171 
01172     Clear();
01173     bool res = Read3DS();
01174     free(m_buffer);
01175     m_buffer = 0;
01176     m_bufferSize = 0;
01177     return res;
01178 }

bool L3DS::Load ( const char *  filename  )  [virtual]

Implements LImporter.

Definition at line 1180 of file OSG3DSLoader.cpp.

References LImporter::Clear(), m_buffer, m_bufferSize, and Read3DS().

01181 {
01182     FILE *f;
01183     f = fopen(filename, "rb");
01184     if (f == 0)
01185     {
01186         fprintf(stderr, "L3DS::LoadFile - cannot open file");
01187         return false;
01188     }
01189     fseek(f, 0, SEEK_END);
01190     m_bufferSize = ftell(f);
01191     fseek(f, 0, SEEK_SET);
01192     m_buffer = (unsigned char*) calloc(m_bufferSize, 1);
01193     if (m_buffer == 0)
01194     {
01195         fprintf(stderr, "L3DS::LoadFile - not enough memory (malloc failed)");
01196         return false;
01197     }
01198     if (fread(m_buffer, m_bufferSize, 1, f) != 1)
01199     {
01200         fclose(f);
01201         free(m_buffer);
01202         m_bufferSize = 0;
01203         fprintf(stderr, "L3DS::LoadFile - error reading from file");
01204         return false;
01205     }
01206     fclose(f);
01207 
01208     Clear();
01209     bool res = Read3DS();
01210     free(m_buffer);
01211     m_buffer = 0;
01212     m_bufferSize = 0;
01213     return res;
01214 }

short L3DS::ReadShort (  )  [protected]

Definition at line 1216 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

Referenced by ReadChunk(), ReadFaceList(), ReadKeyframeData(), ReadKeyheader(), ReadMap(), ReadMaterial(), ReadMesh(), and ReadPercentage().

01217 {
01218     if ((m_buffer!=0) && (m_bufferSize != 0) && ((m_pos+2)<m_bufferSize))
01219     {
01220         short *w = (short*)(m_buffer+m_pos);
01221         short s = *w;//(short)*(m_buffer+m_pos);
01222         m_pos += 2;
01223         return s;
01224     }
01225     m_eof = true;
01226     return 0;
01227 }

int L3DS::ReadInt (  )  [protected]

Definition at line 1229 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

Referenced by ReadChunk(), ReadFaceList(), ReadKeyframeData(), and ReadKeyheader().

01230 {
01231     if ((m_buffer!=0) && (m_bufferSize != 0) && ((m_pos+4)<m_bufferSize))
01232     {
01233         int *w = (int*)(m_buffer+m_pos);
01234         int s = *w;//(int)*(m_buffer+m_pos);
01235         m_pos += 4;
01236         return s;
01237     }
01238     m_eof = true;
01239     return 0;
01240 }

char L3DS::ReadChar (  )  [protected]

Definition at line 1242 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

Referenced by ReadASCIIZ().

01243 {
01244     if ((m_buffer!=0) && (m_bufferSize != 0) && ((m_pos+1)<m_bufferSize))
01245     {
01246         char s = (char)*(m_buffer+m_pos);
01247         m_pos += 1;
01248         return s;
01249     }
01250     m_eof = true;
01251     return 0;
01252 }

float L3DS::ReadFloat (  )  [protected]

Definition at line 1254 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

Referenced by ReadCamera(), ReadColor(), ReadKeyframeData(), ReadKeyheader(), ReadLight(), ReadMap(), ReadMesh(), and ReadPercentage().

01255 {
01256     if ((m_buffer!=0) && (m_bufferSize != 0) && ((m_pos+4)<m_bufferSize))
01257     {
01258         float *w = (float*)(m_buffer+m_pos);
01259         float s = *w;//(float)*(m_buffer+m_pos);
01260         m_pos += 4;
01261         return s;
01262     }
01263     m_eof = true;
01264     return 0.0;
01265 }

byte L3DS::ReadByte (  )  [protected]

Definition at line 1267 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, and m_pos.

Referenced by ReadColor().

01268 {
01269     if ((m_buffer!=0) && (m_bufferSize != 0) && ((m_pos+1)<m_bufferSize))
01270     {
01271         byte s = (byte)*(m_buffer+m_pos);
01272         m_pos += 1;
01273         return s;
01274     }
01275     m_eof = true;
01276     return 0;
01277 }

int L3DS::ReadASCIIZ ( char *  buf,
int  max_count 
) [protected]

Definition at line 1279 of file OSG3DSLoader.cpp.

References m_buffer, m_bufferSize, m_eof, m_pos, and ReadChar().

Referenced by Read3DS(), ReadFaceList(), ReadKeyframeData(), ReadMap(), and ReadMaterial().

01280 {
01281     int count;
01282     if ((m_buffer==0) || (m_bufferSize == 0) || (m_pos>=m_bufferSize))
01283     {
01284         count = 0;
01285         m_eof = true;
01286         return count;
01287     }
01288     count = 0;
01289     char c = ReadChar();
01290     while ((c!=0) && (count<max_count-1))
01291     {
01292         buf[count] = c;
01293         count ++;
01294         c = ReadChar();
01295     }
01296     buf[count] = 0;
01297     return count;
01298 }

void L3DS::Seek ( int  offset,
int  origin 
) [protected]

Definition at line 1300 of file OSG3DSLoader.cpp.

References m_bufferSize, m_eof, m_pos, SEEK_CURSOR, and SEEK_START.

Referenced by GotoChunk(), and SkipChunk().

01301 {
01302     if (origin == SEEK_START)
01303         m_pos = offset;
01304     if (origin == SEEK_CURSOR)
01305         m_pos += offset;
01306     if (static_cast<signed>(m_pos) < 0)
01307         m_pos = 0;
01308     if (m_pos >= m_bufferSize)
01309         m_pos = m_bufferSize-1;
01310     m_eof = false;
01311 }

uint L3DS::Pos (  )  [protected]

Definition at line 1313 of file OSG3DSLoader.cpp.

References m_pos.

Referenced by FindChunk(), and ReadChunk().

01314 {
01315     return m_pos;
01316 }

LChunk L3DS::ReadChunk (  )  [protected]

Definition at line 1318 of file OSG3DSLoader.cpp.

References LChunk::end, LChunk::id, Pos(), ReadInt(), ReadShort(), and LChunk::start.

Referenced by FindChunk(), Read3DS(), ReadCamera(), ReadFaceList(), ReadLight(), ReadMap(), ReadMaterial(), and ReadMesh().

01319 {
01320     LChunk chunk;
01321     chunk.id = ReadShort();
01322     int a = ReadInt();
01323     chunk.start = Pos();
01324     chunk.end = chunk.start+a-6;
01325     return chunk;
01326 }

bool L3DS::FindChunk ( LChunk target,
const LChunk parent 
) [protected]

Definition at line 1328 of file OSG3DSLoader.cpp.

References LChunk::end, LChunk::id, Pos(), ReadChunk(), SkipChunk(), and LChunk::start.

Referenced by Read3DS(), and ReadKeyframeData().

01329 {
01330     if (Pos() >= parent.end)
01331         return false;
01332     LChunk chunk;
01333     chunk = ReadChunk();
01334     while (( chunk.id != target.id) && (chunk.end <= parent.end))
01335     {
01336         SkipChunk(chunk);
01337         if (chunk.end >= parent.end)
01338             break;
01339         unsigned short id = chunk.id;
01340         uint end = chunk.end;
01341         chunk = ReadChunk();
01342         // try to detect a endless loop amz
01343         if(id == chunk.id && end == chunk.end)
01344             break;
01345     }
01346     if (chunk.id == target.id)
01347     {
01348         target.start = chunk.start;
01349         target.end = chunk.end;
01350         return true;
01351     }
01352     return false;
01353 }

void L3DS::SkipChunk ( const LChunk chunk  )  [protected]

Definition at line 1355 of file OSG3DSLoader.cpp.

References LChunk::end, Seek(), and SEEK_START.

Referenced by FindChunk(), Read3DS(), ReadCamera(), ReadFaceList(), ReadLight(), ReadMap(), ReadMaterial(), and ReadMesh().

01356 {
01357     Seek(chunk.end, SEEK_START);
01358 }

void L3DS::GotoChunk ( const LChunk chunk  )  [protected]

Definition at line 1360 of file OSG3DSLoader.cpp.

References Seek(), SEEK_START, and LChunk::start.

Referenced by Read3DS(), ReadColor(), ReadFaceList(), ReadKeyframeData(), ReadMap(), ReadMaterial(), ReadMesh(), and ReadPercentage().

01361 {
01362     Seek(chunk.start, SEEK_START);
01363 }

LColor3 L3DS::ReadColor ( const LChunk chunk  )  [protected]

Definition at line 1365 of file OSG3DSLoader.cpp.

References LColor3::b, black, COLOR_24, COLOR_F, LColor3::g, GotoChunk(), LChunk::id, LIN_COLOR_24, LIN_COLOR_F, LColor3::r, ReadByte(), and ReadFloat().

Referenced by ReadLight(), and ReadMaterial().

01366 {
01367     LColor3 col = black;
01368     GotoChunk(chunk);
01369     switch (chunk.id)
01370     {
01371     case COLOR_F:
01372         col.r = ReadFloat();
01373         col.g = ReadFloat();
01374         col.b = ReadFloat();
01375         break;
01376     case COLOR_24:
01377         col.r = ReadByte()/255.0f;
01378         col.g = ReadByte()/255.0f;
01379         col.b = ReadByte()/255.0f;
01380         break;
01381     case LIN_COLOR_F:
01382         col.r = ReadFloat();
01383         col.g = ReadFloat();
01384         col.b = ReadFloat();
01385         break;
01386     case LIN_COLOR_24:
01387         col.r = ReadByte()/255.0f;
01388         col.g = ReadByte()/255.0f;
01389         col.b = ReadByte()/255.0f;
01390         break;
01391     default:
01392         fprintf(stderr, "L3DS::ReadColor - error this is not a color chunk");
01393     }
01394     return col;
01395 }

float L3DS::ReadPercentage ( const LChunk chunk  )  [protected]

Definition at line 1397 of file OSG3DSLoader.cpp.

References FLOAT_PERCENTAGE, GotoChunk(), LChunk::id, INT_PERCENTAGE, ReadFloat(), and ReadShort().

Referenced by ReadMap(), and ReadMaterial().

01398 {
01399     GotoChunk(chunk);
01400     switch (chunk.id)
01401     {
01402     case INT_PERCENTAGE:
01403         return (ReadShort()/100.0f);
01404     case FLOAT_PERCENTAGE:
01405         return ReadFloat();
01406     }
01407     fprintf(stderr, "L3DS::ReadPercentage - error, the chunk is not a percentage chunk");
01408     return 0;
01409 }

bool L3DS::Read3DS (  )  [protected]

Definition at line 1411 of file OSG3DSLoader.cpp.

References EDIT3DS, EDIT_OBJECT, FindChunk(), GotoChunk(), LChunk::id, KFDATA, LImporter::m_meshes, m_objName, LImporter::m_optLevel, m_pos, MAIN3DS, MAT_ENTRY, OBJ_CAMERA, OBJ_LIGHT, OBJ_TRIMESH, OBJECT_NODE_TAG, ReadASCIIZ(), ReadCamera(), ReadChunk(), ReadKeyframeData(), ReadLight(), ReadMaterial(), ReadMesh(), and SkipChunk().

Referenced by Load().

01412 {
01413     LChunk mainchunk;
01414     LChunk edit;
01415     edit.id = EDIT3DS;
01416     mainchunk = ReadChunk();
01417     if (mainchunk.id != MAIN3DS)
01418     {
01419         fprintf(stderr, "L3DS::Read3DS - wrong file format");
01420         return false;
01421     }
01422     if (!FindChunk(edit, mainchunk))
01423         return false;
01424     LChunk obj;
01425     LChunk ml;
01426 
01427     GotoChunk(edit);
01428     obj.id = MAT_ENTRY;
01429     while (FindChunk(obj, edit))
01430     {
01431         ReadMaterial(obj);
01432         SkipChunk(obj);
01433     }
01434     GotoChunk(edit);
01435 
01436     obj.id = EDIT_OBJECT;
01437     {
01438         while (FindChunk(obj, edit))
01439         {
01440             ReadASCIIZ(m_objName, 99);
01441             ml = ReadChunk();
01442             if (ml.id == OBJ_TRIMESH)
01443                 ReadMesh(ml);
01444             else
01445             if (ml.id == OBJ_LIGHT)
01446                 ReadLight(ml);
01447             else
01448             if (ml.id == OBJ_CAMERA)
01449                 ReadCamera(ml);
01450             SkipChunk(obj);
01451         }
01452     }
01453 
01454     // read the keyframer data here to find out correct object orientation
01455 
01456     LChunk keyframer;
01457     keyframer.id = KFDATA;
01458 
01459     LChunk objtrack;
01460     objtrack.id = OBJECT_NODE_TAG;
01461 
01462     GotoChunk(mainchunk);
01463     if (FindChunk(keyframer, mainchunk))
01464     {   // keyframer chunk is present
01465         GotoChunk(keyframer);
01466         while (FindChunk(objtrack, keyframer))
01467         {
01468             ReadKeyframeData(objtrack);
01469             SkipChunk(objtrack);
01470         }
01471     }
01472 
01473     for (uint i=0; i<m_meshes.size(); i++)
01474         m_meshes[i].Optimize(m_optLevel);
01475     m_pos = 0;
01476     strcpy(m_objName, "");
01477     return true;
01478 }

void L3DS::ReadLight ( const LChunk parent  )  [protected]

Definition at line 1480 of file OSG3DSLoader.cpp.

References COLOR_24, COLOR_F, LChunk::end, LChunk::id, LIN_COLOR_24, LIN_COLOR_F, LIT_INRANGE, LIT_OUTRANGE, LImporter::m_lights, m_objName, ReadChunk(), ReadColor(), ReadFloat(), LLight::SetAttenuationend(), LLight::SetAttenuationstart(), LLight::SetColor(), LLight::SetFalloff(), LLight::SetHotspot(), LObject::SetName(), LLight::SetPosition(), LLight::SetTarget(), SkipChunk(), SPOTLIGHT, LVector3::x, LVector3::y, and LVector3::z.

Referenced by Read3DS().

01481 {
01482     float t;
01483     LVector3 v;
01484     LLight light;
01485     light.SetName(m_objName);
01486     v.x = ReadFloat();
01487     v.y = ReadFloat();
01488     v.z = ReadFloat();
01489     light.SetPosition(v);
01490     LChunk chunk = ReadChunk();
01491     while (chunk.end <= parent.end)
01492     {
01493         switch (chunk.id)
01494         {
01495         case COLOR_24:
01496         case COLOR_F:
01497         case LIN_COLOR_F:
01498         case LIN_COLOR_24:
01499             light.SetColor(ReadColor(chunk));
01500             break;
01501         case SPOTLIGHT:
01502             v.x = ReadFloat();
01503             v.y = ReadFloat();
01504             v.z = ReadFloat();
01505             light.SetTarget(v);
01506             t = ReadFloat();
01507             light.SetHotspot(t);
01508             t = ReadFloat();
01509             light.SetFalloff(t);
01510             break;
01511         case LIT_INRANGE:
01512             light.SetAttenuationstart(ReadFloat());
01513             break;
01514         case LIT_OUTRANGE:
01515             light.SetAttenuationend(ReadFloat());
01516             break;
01517         default:
01518             break;
01519         }
01520         SkipChunk(chunk);
01521         if (chunk.end >= parent.end)
01522             break;
01523         chunk = ReadChunk();
01524 
01525     }
01526     m_lights.push_back(light);
01527 }

void L3DS::ReadCamera ( const LChunk parent  )  [protected]

Definition at line 1529 of file OSG3DSLoader.cpp.

References CAM_RANGES, LChunk::end, LChunk::id, LImporter::m_cameras, m_objName, ReadChunk(), ReadFloat(), LCamera::SetBank(), LCamera::SetFarplane(), LCamera::SetFOV(), LObject::SetName(), LCamera::SetNearplane(), LCamera::SetPosition(), LCamera::SetTarget(), SkipChunk(), LVector3::x, LVector3::y, and LVector3::z.

Referenced by Read3DS().

01530 {
01531     LVector3 v,t;
01532     LCamera camera;
01533     camera.SetName(m_objName);
01534     v.x = ReadFloat();
01535     v.y = ReadFloat();
01536     v.z = ReadFloat();
01537     t.x = ReadFloat();
01538     t.y = ReadFloat();
01539     t.z = ReadFloat();
01540     camera.SetPosition(v);
01541     camera.SetTarget(t);
01542     camera.SetBank(ReadFloat());
01543     camera.SetFOV(2400.0f/ReadFloat());
01544     LChunk chunk = ReadChunk();
01545     while (chunk.end <= parent.end)
01546     {
01547         switch (chunk.id)
01548         {
01549         case CAM_RANGES:
01550             camera.SetNearplane(ReadFloat());
01551             camera.SetFarplane(ReadFloat());
01552             break;
01553         default:
01554             break;
01555         }
01556         SkipChunk(chunk);
01557         if (chunk.end >= parent.end)
01558             break;
01559         chunk = ReadChunk();
01560 
01561     }
01562     m_cameras.push_back(camera);
01563 }

void L3DS::ReadMesh ( const LChunk parent  )  [protected]

Definition at line 1565 of file OSG3DSLoader.cpp.

References LMatrix4::_11, LMatrix4::_12, LMatrix4::_13, LMatrix4::_14, LMatrix4::_21, LMatrix4::_22, LMatrix4::_23, LMatrix4::_24, LMatrix4::_31, LMatrix4::_32, LMatrix4::_33, LMatrix4::_34, LMatrix4::_41, LMatrix4::_42, LMatrix4::_43, LMatrix4::_44, LChunk::end, LMesh::GetVertexCount(), GotoChunk(), LChunk::id, LImporter::m_meshes, m_objName, OSG::p, ReadChunk(), ReadFaceList(), ReadFloat(), ReadShort(), LMesh::SetMatrix(), LObject::SetName(), LMesh::SetUV(), LMesh::SetVertex(), LMesh::SetVertexArraySize(), SkipChunk(), TRI_FACELIST, TRI_FACEMAPPING, TRI_MATRIX, TRI_VERTEXLIST, LVector2::x, and LVector2::y.

Referenced by Read3DS().

01566 {
01567     unsigned short count, i;
01568     LVector4 p;
01569     LMatrix4 m;
01570     LVector2 t;
01571     p.w = 1.0f;
01572     LMesh mesh;
01573     mesh.SetName(m_objName);
01574     GotoChunk(parent);
01575     LChunk chunk = ReadChunk();
01576     while (chunk.end <= parent.end)
01577     {
01578         switch (chunk.id)
01579         {
01580         case TRI_VERTEXLIST:
01581             count = ReadShort();
01582             mesh.SetVertexArraySize(count);
01583             for (i=0; i < count; i++)
01584             {
01585                 p.x = ReadFloat();
01586                 p.y = ReadFloat();
01587                 p.z = ReadFloat();
01588                 mesh.SetVertex(p, i);
01589             }
01590             break;
01591         case TRI_FACEMAPPING:
01592             count = ReadShort();
01593             if (mesh.GetVertexCount() == 0)
01594                 mesh.SetVertexArraySize(count);
01595             for (i=0; i < count; i++)
01596             {
01597                 t.x = ReadFloat();
01598                 t.y = ReadFloat();
01599                 mesh.SetUV(t, i);
01600             }
01601             break;
01602         case TRI_FACELIST:
01603             ReadFaceList(chunk, mesh);
01604             break;
01605         case TRI_MATRIX:
01606             m._11 = ReadFloat();
01607             m._12 = ReadFloat();
01608             m._13 = ReadFloat();
01609 
01610             m._21 = ReadFloat();
01611             m._22 = ReadFloat();
01612             m._23 = ReadFloat();
01613 
01614             m._31 = ReadFloat();
01615             m._32 = ReadFloat();
01616             m._33 = ReadFloat();
01617 
01618             m._41 = ReadFloat();
01619             m._42 = ReadFloat();
01620             m._43 = ReadFloat();
01621 
01622             m._14 = 0.0f;
01623             m._24 = 0.0f;
01624             m._34 = 0.0f;
01625             m._44 = 1.0f;
01626 
01627             mesh.SetMatrix(m);
01628             break;
01629         default:
01630             break;
01631         }
01632         SkipChunk(chunk);
01633         if (chunk.end >= parent.end)
01634             break;
01635         chunk = ReadChunk();
01636     }
01637     m_meshes.push_back(mesh);
01638 }

void L3DS::ReadFaceList ( const LChunk chunk,
LMesh mesh 
) [protected]

Definition at line 1640 of file OSG3DSLoader.cpp.

References LTri::a, LMesh::AddMaterial(), LTri::b, LTri::c, LChunk::end, LImporter::FindMaterial(), LMaterial::GetID(), LMesh::GetTri(), LMesh::GetTriangleCount(), GotoChunk(), LChunk::id, LTri::materialId, ReadASCIIZ(), ReadChunk(), ReadInt(), ReadShort(), LMesh::SetTri(), LMesh::SetTriangleArraySize(), SkipChunk(), LTri::smoothingGroups, TRI_FACELIST, TRI_MAT_GROUP, and TRI_SMOOTH_GROUP.

Referenced by ReadMesh().

01641 {
01642     // variables
01643     unsigned short count, t;
01644     uint i;
01645     LTri tri;
01646     LChunk ch;
01647     char str[20];
01648     //uint mat;
01649 
01650     // consistency checks
01651     if (chunk.id != TRI_FACELIST)
01652     {
01653         fprintf(stderr, "L3DS::ReadFaceList - internal error: wrong chunk passed as parameter");
01654         return;
01655     }
01656     GotoChunk(chunk);
01657     tri.smoothingGroups = 1;
01658     // read the number of faces
01659     count = ReadShort();
01660     mesh.SetTriangleArraySize(count);
01661     for (i=0; i<count; i++)
01662     {
01663         tri.a = ReadShort();
01664         tri.b = ReadShort();
01665         tri.c = ReadShort();
01666         ReadShort();
01667         mesh.SetTri(tri, i);
01668     }
01669     // now read the optional chunks
01670     ch = ReadChunk();
01671     int mat_id;
01672     while (ch.end <= chunk.end)
01673     {
01674         switch (ch.id)
01675         {
01676         case TRI_MAT_GROUP:
01677             ReadASCIIZ(str, 20);
01678             mat_id = FindMaterial(str)->GetID();
01679             mesh.AddMaterial(mat_id);
01680             count = ReadShort();
01681             for (i=0; i<count; i++)
01682             {
01683                 t = ReadShort();
01684                 mesh.GetTri(t).materialId = mat_id;
01685             }
01686             break;
01687         case TRI_SMOOTH_GROUP:
01688             for (i=0; i<mesh.GetTriangleCount(); i++)
01689                 mesh.GetTri(i).smoothingGroups = (ulong) ReadInt();
01690