void C3DSLoader::ReadNextObjChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreChunk) { int buffer[50000] = {0}; m_CurrentChunk = new tChunk; while (pPreChunk->bytesRead < pPreChunk->length) { ReadChunk(m_CurrentChunk); switch (m_CurrentChunk->ID) { case OBJ_MESH: ReadNextObjChunk(pModel, pObject, m_CurrentChunk); break; case OBJ_VERTICES: ReadVertices(pObject, m_CurrentChunk); break; case OBJ_FACES: ReadVertexIndices(pObject, m_CurrentChunk); break; case OBJ_MATERIAL: ReadObjMat(pModel, pObject, m_CurrentChunk); break; case OBJ_UV: ReadUVCoordinates(pObject, m_CurrentChunk); break; default: m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; } pPreChunk->bytesRead += m_CurrentChunk->bytesRead; } delete m_CurrentChunk; m_CurrentChunk = pPreChunk; }
void CLoad3DS::ProcessNextObjectChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk) { // The current chunk to work with tChunk currentChunk = {0}; // Continue to read these chunks until we read the end of this sub chunk while (pPreviousChunk->bytesRead < pPreviousChunk->length) { // Read the next chunk ReadChunk(¤tChunk); // Check which chunk we just read switch (currentChunk.ID) { case OBJECT_MESH: // This lets us know that we are reading a new object // We found a new object, so let's read in it's info using recursion ProcessNextObjectChunk(pModel, pObject, ¤tChunk); break; case OBJECT_VERTICES: // This is the objects vertices ReadVertices(pObject, ¤tChunk); break; case OBJECT_FACES: // This is the objects face information ReadVertexIndices(pObject, ¤tChunk); break; case OBJECT_MATERIAL: // This holds the material name that the object has // This chunk holds the name of the material that the object has assigned to it. // This could either be just a color or a texture map. This chunk also holds // the faces that the texture is assigned to (In the case that there is multiple // textures assigned to one object, or it just has a texture on a part of the object. // Since most of my game objects just have the texture around the whole object, and // they aren't multitextured, I just want the material name. // We now will read the name of the material assigned to this object ReadObjectMaterial(pModel, pObject, ¤tChunk); break; case OBJECT_UV: // This holds the UV texture coordinates for the object // This chunk holds all of the UV coordinates for our object. Let's read them in. ReadUVCoordinates(pObject, ¤tChunk); break; default: // Read past the ignored or unknown chunks currentChunk.bytesRead += fread(gBuffer, 1, currentChunk.length - currentChunk.bytesRead, m_FilePointer); break; } // Add the bytes read from the last chunk to the previous chunk passed in. pPreviousChunk->bytesRead += currentChunk.bytesRead; } }
void ModelLoader::ProcessNextObjectChunk(Model3DS *pModel, Object3DS *pObject, Chunk *pPreviousChunk) { // The current chunk to work with Chunk currentChunk = {0}; // Continue to read these chunks until we read the end of this sub chunk while (pPreviousChunk->bytesRead < pPreviousChunk->length){ // Read the next chunk ReadChunk(¤tChunk); // Check which chunk we just read switch (currentChunk.ID){ case OBJECT_MESH: // This case means we hit a new object, so jump in again and read this next chunk ProcessNextObjectChunk(pModel, pObject, ¤tChunk); break; case OBJECT_VERTICES: // Object vertices ReadVertices(pObject, ¤tChunk); break; case OBJECT_FACES: // Object faces ReadVertexIndices(pObject, ¤tChunk); break; case OBJECT_MATERIAL: // This chunk stores both texture information, or color information // depending on the object. At the moment we'll just support textures // so we'll read in the name of the texture and build it later. If there // is just color we'll not bother then. ReadObjectMaterial(pModel, pObject, ¤tChunk); break; case OBJECT_UV: // UV coordinates ReadUVCoordinates(pObject, ¤tChunk); break; default: // Ignored chunk, read past it. currentChunk.bytesRead += fread(m_Buffer, 1, currentChunk.length - currentChunk.bytesRead, m_FilePointer); break; } // Add the bytes read from the last chunk to the previous chunk passed in. pPreviousChunk->bytesRead += currentChunk.bytesRead; } }
void ProcessNextObjectChunk(Loader3ds *pt3ds,tChunk *pPreviousChunk) { tChunk currentChunk = {0}; while (pPreviousChunk->bytesRead < pPreviousChunk->length) { // Read the next chunk ReadChunk(pt3ds,¤tChunk); switch (currentChunk.ID) { case OBJECT_MESH: // We found a new object so use recursion ProcessNextObjectChunk(pt3ds,¤tChunk); break; case OBJECT_VERTICES: // 4110This is the objects vertices ReadVertices(pt3ds,¤tChunk); break; case OBJECT_FACES: // 4120This is the objects face information ReadVertexIndices(pt3ds,¤tChunk); break; case OBJECT_MATERIAL: ReadObjectMaterial(pt3ds,¤tChunk); break; case OBJECT_UV: // 4140This holds the UV texture coordinates for the object ReadUVCoordinates(pt3ds,¤tChunk); break; case OBJECT_TRANSF: // 4160 ReadObjectTransf(pt3ds,¤tChunk); break; default: currentChunk.bytesRead += fread(pt3ds->gBuffer, 1, currentChunk.length - currentChunk.bytesRead, pt3ds->FilePointer); break; } pPreviousChunk->bytesRead += currentChunk.bytesRead; } }
void CLoad3DS::ProcessNextObjectChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk) { // int buffer[50000] = {0}; // int *buffer = new int[50000]; m_CurrentChunk = new tChunk; while (pPreviousChunk->bytesRead < pPreviousChunk->length) { ReadChunk(m_CurrentChunk); switch (m_CurrentChunk->ID) { case OBJECT_MESH: ProcessNextObjectChunk(pModel, pObject, m_CurrentChunk); break; case OBJECT_VERTICES: ReadVertices(pObject, m_CurrentChunk); break; case OBJECT_FACES: ReadVertexIndices(pObject, m_CurrentChunk); break; case OBJECT_MATERIAL: ReadObjectMaterial(pModel, pObject, m_CurrentChunk); break; case OBJECT_UV: ReadUVCoordinates(pObject, m_CurrentChunk); break; default: // m_CurrentChunk->bytesRead += ASSET_READ(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); ASSET_SEEK(m_FilePointer, m_CurrentChunk->length - m_CurrentChunk->bytesRead, SEEK_CUR); m_CurrentChunk->bytesRead += (m_CurrentChunk->length - m_CurrentChunk->bytesRead); break; } pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead; } delete m_CurrentChunk; m_CurrentChunk = pPreviousChunk; // delete []buffer; }
// 下面的函数处理所有的文件中对象的信息 void CLoad3DS::ReadNextObjChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreChunk) { int buffer[50000] = {0}; // 用于读入不需要的数据 // 对新的块分配存储空间 m_CurrentChunk = new tChunk; // 继续读入块的内容直至本子块结束 while (pPreChunk->bytesRead < pPreChunk->length) { // 读入下一个块 ReadChunk(m_CurrentChunk); // 区别读入是哪种块 switch (m_CurrentChunk->ID) { case OBJ_MESH: // 正读入的是一个新块 // 使用递归函数调用,处理该新块 ReadNextObjChunk(pModel, pObject, m_CurrentChunk); break; case OBJ_VERTICES: // 读入是对象顶点 ReadVertices(pObject, m_CurrentChunk); break; case OBJ_FACES: // 读入的是对象的面 ReadVertexIndices(pObject, m_CurrentChunk); break; case OBJ_MATERIAL: // 读入的是对象的材质名称 // 该块保存了对象材质的名称,可能是一个颜色,也可能是一个纹理映射。同时在该块中也保存了 // 纹理对象所赋予的面 // 下面读入对象的材质名称 ReadObjMat(pModel, pObject, m_CurrentChunk); break; case OBJ_UV: // 读入对象的UV纹理坐标 // 读入对象的UV纹理坐标 ReadUVCoordinates(pObject, m_CurrentChunk); break; default: // 略过不需要读入的块 m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; } // 添加从最后块中读入的字节数到前面的读入的字节中 pPreChunk->bytesRead += m_CurrentChunk->bytesRead; } // 释放当前块的内存空间,并把当前块设置为前面块 delete m_CurrentChunk; m_CurrentChunk = pPreChunk; }
void Loaders::t3DSLoader::ProcessNextObjectChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk) { m_CurrentChunk = new tChunk; while (pPreviousChunk->bytesRead < pPreviousChunk->length) { ReadChunk(m_CurrentChunk); switch (m_CurrentChunk->ID) { case OBJECT_MESH: ProcessNextObjectChunk(pModel, pObject, m_CurrentChunk); break; case OBJECT_VERTICES: ReadVertices(pObject, m_CurrentChunk); break; case OBJECT_FACES: ReadVertexIndices(pObject, m_CurrentChunk); break; case OBJECT_MATERIAL: ReadObjectMaterial(pModel, pObject, m_CurrentChunk); break; case OBJECT_UV: ReadUVCoordinates(pObject, m_CurrentChunk); break; default: m_CurrentChunk->bytesRead += fread(gBuffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; } pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead; } delete m_CurrentChunk; m_CurrentChunk = pPreviousChunk; }