//*************************************************************************** static void ReadMaterial(header_t *chunkmat,material_t *material) { header_t *chunk=chunkmat+1; uint size=chunkmat->len,pos=0; while(pos<size) { switch(chunk->id) { case C_MATNAME: strcpy(material->name,(char*)(chunk+1)); break; case C_AMBIENT: ReadRGB(chunk,&material->ambient); break; case C_SPECULAR: ReadRGB(chunk,&material->specular); break; case C_DIFFUSE: ReadRGB(chunk,&material->diffuse); break; case C_TWOSIDED: material->twosided=1; break; case C_WIRED: material->wired=1; break; case C_TEXTMAP: ReadMap(chunk,&material->textmappath); break; case C_REFLMAP: ReadMap(chunk,&material->reflmappath); break; case C_BUMPMAP: ReadMap(chunk,&material->bumpmappath); break; case C_TRANSMAP: ReadMap(chunk,&material->transpmappath); break; } pos+=chunk->len; chunk=(header_t*)((uint)chunk+chunk->len); } }
static ILboolean ReadPsd(ILimage* image, PSDHEAD *Head) { switch (Head->Mode) { case 1: // Greyscale return ReadGrey(image, Head); case 2: // Indexed return ReadIndexed(image, Head); case 3: // RGB return ReadRGB(image, Head); case 4: // CMYK return ReadCMYK(image, Head); } iSetError(IL_FORMAT_NOT_SUPPORTED); return IL_FALSE; }
Mesh* Load3ds(string URL, Entity* parent_ent){ int Size; //Local OldDir:String unsigned char Red, Green, Blue; //unsigned char Percent; //Local Pixmap:TPixmap Stream = File::ReadResourceFile(URL); if (Stream == 0) return 0; //Size = Stream.Size() fseek(Stream->pFile, 0, SEEK_END); // seek to end of file Size = ftell(Stream->pFile); // get current file pointer fseek(Stream->pFile, 0, SEEK_SET); // Read Main-Chunk ReadChunk(); if (ChunkID != M3D_3DS_MAIN || ChunkSize != Size) { Stream->CloseFile(); //Print "No 3DS File" return 0; } // Find 3DEditor-Chunk while (Stream->Eof()==0){ ReadChunk(); if (ChunkID == M3D_3DS_3DEDITOR){ break; }else{ SkipChunk(); } } //OldDir = CurrentDir() //If String(URL) <> "" Then ChangeDir(ExtractDir(String(URL))) mesh = Mesh::CreateMesh(); while (Stream->Eof()==0){ ReadChunk(); switch (ChunkID){ case M3D_3DS_OBJECTBLOCK: ReadCString(); // ' ObjectName break; case M3D_3DS_BrushBLOCK: ReadBrushBlock(); break; case M3D_3DS_TRIMESH: ReadTriMesh(); break; case M3D_3DS_VERTEXLIST: ReadVertexList(); break; case M3D_3DS_FACELIST: ReadFaceList(); break; case M3D_3DS_FACEMATLIST: ReadFaceMatList(); break; case M3D_3DS_TEXCOORDS: ReadTexCoords(); break; case M3D_3DS_BrushNAME: //Loader.Brush = CreateBrush() brush->name = ReadCString(); break; case M3D_3DS_BrushAMBIENT: //ReadChunk(); //ReadRGB(ChunkID, Red, Green, Blue); //brush->SetAmbientColor(Red, Green, Blue); break; case M3D_3DS_BrushDIFFUSE: ReadChunk(); ReadRGB(ChunkID, Red, Green, Blue); brush->BrushColor(Red, Green, Blue); break; case M3D_3DS_BrushSPECULAR: //'Loader.ReadChunk() //'Loader.ReadRGB(Loader.ChunkID, Red, Green, Blue) //'Loader.Brush.SetSpecularColor(Red, Green, Blue) break; case M3D_3DS_BrushSHININESS: //'Loader.ReadChunk() //'Percent = Loader.ReadPercent(Loader.ChunkID) //'Loader.Brush.BrushShininess(Percent) break; case M3D_3DS_MAPFILENAME: LoadMap(); break; case M3D_3DS_MAPVSCALE: texture->v_scale = Stream->ReadFloat(); break; case M3D_3DS_MAPUSCALE: texture->u_scale = Stream->ReadFloat(); break; case M3D_3DS_MAPUOFFSET: texture->u_pos = Stream->ReadFloat(); break; case M3D_3DS_MAPVOFFSET: texture->v_pos = Stream->ReadFloat(); break; case M3D_3DS_MAPROTATION: texture->angle = Stream->ReadFloat(); break; default: if ((ChunkID == M3D_3DS_TEXTUREMAP1) || (ChunkID == M3D_3DS_TEXTUREMAP2)) { ReadMap(ChunkID); }else{ SkipChunk(); } } } Stream->CloseFile(); if (surface!=0){ MovedTris.sort(); int CheckSurface=0; for(list<int>::const_reverse_iterator it = MovedTris.rbegin(); it != MovedTris.rend(); it++){ surface->RemoveTri(*it); CheckSurface=1; } MovedTris.clear(); if (surface->no_tris==0 && CheckSurface !=0) { delete surface; mesh->surf_list.remove(surface); mesh->no_surfs=mesh->no_surfs-1; } } // ChangeDir(OldDir) // Loader.Surface.UpdateVertices() // Loader.Surface.UpdateTriangles() mesh->UpdateNormals(); /*Loader.Mesh.UpdateBuffer() Print Loader.Surface.Tris.Length Print Loader.Surface.no_verts 'Loader.Mesh.FlipMesh()*/ mesh->class_name="Mesh"; mesh->AddParent(*parent_ent); Entity::entity_list.push_back(mesh); if(mesh->parent!=0){ mesh->mat.Overwrite(mesh->parent->mat); mesh->UpdateMat(); }else{ mesh->UpdateMat(true); } return mesh; }