123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- //
- // This file was originally written by Salvatore Russo.
- // I (Nikolaus Gebhardt) did some minor modifications changes to it and integrated
- // it into Irrlicht:
- // - removed STL dependency
- // - removed log file and replaced it with irrlicht logging
- // - adapted code formatting a bit to Irrlicht style
- // - removed memory leaks
- // Thanks a lot to Salvatore for his work on this and that he gave me
- // his permission to add it into Irrlicht.
- // This support library has been made by Salvatore Russo and is released under GNU public license for general uses.
- // For uses in Irrlicht core and only for Irrlicht related uses I release this library under zlib license.
- #ifndef __DMF_SUPPORT_H_INCLUDED__
- #define __DMF_SUPPORT_H_INCLUDED__
- #include "irrString.h"
- #include "fast_atof.h"
- namespace irr
- {
- namespace scene
- {
- namespace
- {
- /** A structure representing some DeleD infos.
- This structure contains data about DeleD level file like: version, ambient color, number of objects etc...*/
- struct dmfHeader
- {
- //main file header
- core::stringc dmfName; //!<Scene name
- f32 dmfVersion; //!<File version
- video::SColor dmfAmbient; //!<Ambient color
- f32 dmfShadow; //!<Shadow intensity
- u32 numObjects; //!<Number of objects in this scene
- u32 numMaterials; //!<Number of materials in this scene
- u32 numVertices; //!<Total number of vertices faces*(vertices for each face)
- u32 numFaces; //!<Total number of faces
- u32 numLights; //!<Number of dynamic lights in this scene
- u32 numWatVertices; //!<Total number of vertices of water plains watfaces*(vertices for each face)
- u32 numWatFaces; //!<Total number of faces for water plains.Note that each water plane is a rectangle with one face only.
- };
- /** A structure representing a DeleD material.
- This structure contains texture names, an ID and some flags.*/
- struct dmfMaterial
- {
- u32 materialID;//!<This material unique ID.
- u32 textureLayers;//!<First texture Flag (0=Normal, 1=Color).
- u32 textureFlag;//!<First texture Flag (0=Normal, 1=Color).
- u32 lightmapFlag;//!<Lightmap Flag (0=Normal, others not considered).
- u32 textureBlend;//!<Texture Blend mode used to support alpha maps (4=Alpha map, others not implemented yet).
- core::stringc pathName;//!<Name of path defined in path element.
- core::stringc textureName;//!<Name of first texture (only file name, no path).
- core::stringc lightmapName;//!<Name of lightmap (only file name, no path).
- u32 lightmapBlend;//!<Blend mode used to support alpha maps (not implemented yet).
- };
- /** A structure representing a single face.
- This structure contains first vertice index, number of vertices and the material used.*/
- struct dmfFace
- {
- u32 firstVert;//!<First vertex index.
- u32 numVerts;//!<Number of vertices for this face.
- u32 materialID;//!<Material used for this face.
- };
- /** A structure representing a single vertice.
- This structure contains vertice position coordinates and texture an lightmap UV.*/
- struct dmfVert
- {
- core::vector3df pos;//!<Position of vertex
- core::vector2df tc;//!<Texture UV coords
- core::vector2df lc;//!<Lightmap UV coords
- };
- /** A structure representing a single dynamic light.
- This structure contains light position coordinates, diffuse color, specular color and maximum radius of light.*/
- struct dmfLight
- {
- core::vector3df pos;//!<Position of this light.
- video::SColorf diffuseColor;//!<Diffuse color.
- video::SColorf specularColor;//!<Specular color.
- f32 radius;//!<Maximum radius of light.
- };
- /** A structure representing a single water plane.
- This structure contains light position coordinates, diffuse color, specular color and maximum radius of light.*/
- struct dmfWaterPlane
- {
- u32 waterID;//!<ID of specified water plane.
- u32 numFaces;//!<number of faces that make this plain.Owing to the fact that this is a rectangle you'll have 1 every time.
- u32 firstFace;//!<first face of this plain.
- core::dimension2d<u32> tileNum;//!<number of tiles of this water plain.
- f32 waveHeight;//!<height of waves.
- f32 waveSpeed;//!<waves speed.
- f32 waveLength;//!<waves length.
- };
- /** A function to convert a hexstring to a int.
- This function converts an hex string (i.e. FF) to its int value (i.e. 255).
- \return An int representing the hex input value.*/
- int axtoi(const char *hexStg)
- {
- unsigned int intValue = 0; // integer value of hex string
- sscanf(hexStg, "%x", &intValue);
- return (intValue);
- }
- typedef core::array<core::stringc> StringList;
- //Loads a stringlist from a file
- //note that each String added to StringList
- //is separated by a \\n character and it's present
- //at the end of line.
- /** Loads a StringList from a file.
- This function loads a StringList from a file where each string is divided by a \\n char.*/
- void LoadFromFile(io::IReadFile* file, StringList& strlist)
- {
- const long sz = file->getSize();
- char* buf = new char[sz+1];
- file->read(buf, sz);
- buf[sz] = 0;
- char* p = buf;
- char* start = p;
- while(*p)
- {
- if (*p == '\n')
- {
- core::stringc str(start, (u32)(p - start - 1));
- str.trim();
- strlist.push_back(str);
- start = p+1;
- }
- ++p;
- }
- if (p - start > 1)
- {
- core::stringc str(start, (u32)(p - start - 1));
- str.trim();
- strlist.push_back(str);
- }
- delete [] buf;
- };
- //This function subdivides a string in a list of strings
- /** This function subdivides strings divided by divider in a list of strings.
- \return A StringList made of all strings divided by divider.*/
- StringList SubdivideString(const core::stringc& str, const core::stringc& divider)
- {
- StringList strings; //returned StringList
- strings.clear(); //clear returned stringlist
- int c=0;
- int l=str.size();
- //process entire string
- while(c<l)
- {
- core::stringc resultstr;
- resultstr = "";
- //read characters until divider is encountered
- while((str[c]!=divider[0]) && c<l)
- {
- resultstr += str[c];
- ++c;
- }
- //Remove spaces \t and \n from string in my implementation...
- //pay attention or change it in dll.h if you don't want to remove
- //a particular char.
- resultstr.trim();//trims string resultstr
- strings.push_back(resultstr);//add trimmed string
- ++c;
- }
- return strings;
- }
- //Get DeleD informations and convert in dmfHeader
- /**This function extract a dmfHeader from a DMF file.
- You must give in input a StringList representing a DMF file loaded with LoadFromFile.
- \return true if function succeed or false on fail.*/
- bool GetDMFHeader(const StringList& RawFile, dmfHeader& header)
- {
- StringList temp;
- RawFile[0].split(temp, ";"); //file info
- // StringList temp=SubdivideString(RawFile[0],";"); //file info
- if ( temp[0] != "DeleD Map File" )
- return false; //not a deled file
- temp.clear();
- temp = SubdivideString(RawFile[1]," ");//get version
- StringList temp1=SubdivideString(temp[1],";");
- header.dmfVersion = (float)atof(temp1[0].c_str());//save version
- if (header.dmfVersion < 0.91)
- return false;//not correct version
- temp.clear();
- temp = SubdivideString(RawFile[2],";");//get name,ambient color and shadow opacity
- header.dmfName=temp[0];//save name
- //set ambient color
- header.dmfAmbient.set(axtoi(temp[1].c_str()));
- //set Shadow intensity
- header.dmfShadow = (float)atof(temp[2].c_str());
- //set current position
- int offs=3;
- //set Materials Number
- header.numMaterials=atoi(RawFile[offs].c_str());
- offs+=header.numMaterials;
- ++offs;
- //set Object Number
- header.numObjects=atoi(RawFile[offs].c_str());
- //retrieve face and vertices number
- header.numVertices=0;
- header.numFaces=0;
- header.numWatFaces=0;
- header.numWatVertices=0;
- offs++;
- s32 fac;
- int i;
- for(i=0; i < (int)header.numObjects; i++)
- {
- StringList wat=SubdivideString(RawFile[offs],";");
- StringList wat1=SubdivideString(wat[0],"_");
- ++offs;
- offs += atoi(RawFile[offs].c_str());
- ++offs;
- fac=atoi(RawFile[offs].c_str());
- if(!(wat1[0]=="water" && wat[2]=="0"))
- header.numFaces = header.numFaces + fac;
- else
- header.numWatFaces = header.numWatFaces + fac;
- offs++;
- for(int j=0; j<fac; j++)
- {
- if(!(wat1[0] == "water" && wat[2] == "0"))
- header.numVertices=header.numVertices + atoi(RawFile[offs+j].c_str());
- else
- header.numWatVertices=header.numWatVertices + atoi(RawFile[offs + j].c_str());
- }
- offs = offs + fac;
- }
- //retrieve number of dynamic lights
- header.numLights=0;
- temp.clear();
- temp1.clear();
- s32 lit = atoi(RawFile[offs].c_str());
- for (i=0; i<lit; i++)
- {
- offs++;
- temp=SubdivideString(RawFile[offs],";");
- if(atoi(temp[0].c_str())==1)
- {
- temp1=SubdivideString(temp[18],"_");
- if(temp1[0]=="dynamic")
- header.numLights++;
- }
- temp.clear();
- temp1.clear();
- }
- return true; //everything is OK so loading is correct
- }
- /**This function extract an array of dmfMaterial from a DMF file.
- You must give in input a StringList representing a DMF file loaded with LoadFromFile.
- \param RawFile StringList representing a DMF file.
- \param materials Materials returned.
- \param num_material Number of materials contained in DMF file.
- \param use_material_dirs Here you can choose to use default DeleD structure for material dirs.
- \return true if function succeed or false on fail.*/
- bool GetDMFMaterials(const StringList& RawFile,
- core::array<dmfMaterial>& materials,
- int num_material)
- {
- // offset for already handled lines
- const int offs=4;
- StringList temp;
- StringList temp1;
- // The number of materials is predetermined
- materials.reallocate(num_material);
- for(int i=0; i<num_material; ++i)
- {
- materials.push_back(dmfMaterial());
- // get all tokens
- temp=SubdivideString(RawFile[offs+i],";");
- // should be equal to first token
- materials[i].materialID = i;
- // The path used for the texture
- materials[i].pathName = temp[2];
- materials[i].pathName.replace('\\','/');
- materials[i].pathName += "/";
- // temp[3] is reserved, temp[4] is the number of texture layers
- materials[i].textureLayers = core::strtoul10(temp[4].c_str());
- // Three values are separated by commas
- temp1=SubdivideString(temp[5],",");
- materials[i].textureFlag = atoi(temp1[0].c_str());
- materials[i].textureName=temp1[1];
- materials[i].textureName.replace('\\','/');
- materials[i].textureBlend = atoi(temp1[2].c_str());
- if(temp.size()>=9)
- {
- temp1=SubdivideString(temp[temp.size() - 1],",");
- materials[i].lightmapFlag=atoi(temp1[0].c_str());
- materials[i].lightmapName=temp1[1];
- materials[i].lightmapName.replace('\\','/');
- materials[i].lightmapBlend = atoi(temp1[2].c_str());
- }
- else
- {
- materials[i].lightmapFlag=1;
- materials[i].lightmapName="";
- }
- }
- return true;
- }
- /**This function extract an array of dmfMaterial from a DMF file considering 1st an 2nd layer for water plains.
- You must give in input a StringList representing a DMF file loaded with LoadFromFile.
- \return true if function succeed or false on fail.*/
- bool GetDMFWaterMaterials(const StringList& RawFile /**<StringList representing a DMF file.*/,
- core::array<dmfMaterial>& materials/**<Materials returned.*/,
- int num_material/**<Number of materials contained in DMF file.*/
- )
- {
- int offs=4;
- StringList temp;
- StringList temp1;
- StringList temp2;
- //Checking if this is a DeleD map File of version >= 0.91
- temp=SubdivideString(RawFile[0],";");//file info
- if ( temp[0] != "DeleD Map File" )
- return false;//not a deled file
- temp.clear();
- temp=SubdivideString(RawFile[1]," ");//get version
- temp1=SubdivideString(temp[1],";");
- if (atof(temp1[0].c_str()) < 0.91)
- return false;//not correct version
- //end checking
- temp.clear();
- temp1.clear();
- for(int i=0;i<num_material;i++)
- {
- temp = SubdivideString(RawFile[offs+i],";");
- materials[i].materialID=i;
- temp1 = SubdivideString(temp[5],",");
- materials[i].textureFlag=atoi(temp1[0].c_str());
- temp2 = SubdivideString(temp1[1],"\\");
- materials[i].textureName=temp2.getLast();
- temp1.clear();
- temp2.clear();
- int a=temp.size();
- if(a==7)
- {
- temp1=SubdivideString(temp[6],",");
- materials[i].lightmapFlag=atoi(temp1[0].c_str());
- temp2=SubdivideString(temp1[1],"\\");
- materials[i].lightmapName=temp2.getLast();
- }
- else
- {
- materials[i].lightmapFlag=1;
- materials[i].lightmapName="FFFFFFFF";
- }
- temp1.clear();
- temp2.clear();
- }
- return true;
- }
- /**This function extract an array of dmfVert and dmfFace from a DMF file.
- You must give in input a StringList representing a DMF file loaded with LoadFromFile and two arrays long enough.
- Please use GetDMFHeader() before this function to know number of vertices and faces.
- \return true if function succeed or false on fail.*/
- bool GetDMFVerticesFaces(const StringList& RawFile/**<StringList representing a DMF file.*/,
- dmfVert vertices[]/**<Vertices returned*/,
- dmfFace faces[]/**Faces returned*/
- )
- {
- StringList temp,temp1;
- // skip materials
- s32 offs = 4 + atoi(RawFile[3].c_str());
- const s32 objs = atoi(RawFile[offs].c_str());
- offs++;
- #ifdef _IRR_DMF_DEBUG_
- os::Printer::log("Reading objects", core::stringc(objs).c_str());
- #endif
- s32 vert_cnt=0, face_cnt=0;
- for (int i=0; i<objs; ++i)
- {
- StringList wat=SubdivideString(RawFile[offs],";");
- StringList wat1=SubdivideString(wat[0],"_");
- #ifdef _IRR_DMF_DEBUG_
- os::Printer::log("Reading object", wat[0].c_str());
- #endif
- offs++;
- // load vertices
- core::array<core::vector3df> pos;
- const u32 posCount = core::strtoul10(RawFile[offs].c_str());
- ++offs;
- pos.reallocate(posCount);
- for (u32 i=0; i<posCount; ++i)
- {
- temp1=SubdivideString(RawFile[offs].c_str(),";");
- pos.push_back(core::vector3df(core::fast_atof(temp1[0].c_str()),
- core::fast_atof(temp1[1].c_str()),
- -core::fast_atof(temp1[2].c_str())));
- ++offs;
- }
- const u32 numFaces=core::strtoul10(RawFile[offs].c_str());
- offs++;
- if(!(wat1[0]=="water" && wat[2]=="0"))
- {
- for(u32 j=0; j<numFaces; ++j)
- {
- temp=SubdivideString(RawFile[offs+j],";");
- //first value is vertices number for this face
- const u32 vert=core::strtoul10(temp[0].c_str());
- faces[face_cnt].numVerts=vert;
- //second is material ID
- faces[face_cnt].materialID=core::strtoul10(temp[1].c_str());
- //vertices are ordined
- faces[face_cnt].firstVert=vert_cnt;
- //now we'll create vertices structure
- for(u32 k=0; k<vert; ++k)
- {
- //copy position
- vertices[vert_cnt].pos.set(pos[core::strtoul10(temp[2+k].c_str())]);
- //get uv coords for tex and light if any
- vertices[vert_cnt].tc.set(core::fast_atof(temp[2+vert+(2*k)].c_str()),
- core::fast_atof(temp[2+vert+(2*k)+1].c_str()));
- const u32 tmp_sz=temp.size();
- vertices[vert_cnt].lc.set(core::fast_atof(temp[tmp_sz-(2*vert)+(2*k)].c_str()),
- core::fast_atof(temp[tmp_sz-(2*vert)+(2*k)+1].c_str()));
- vert_cnt++;
- }
- face_cnt++;
- }
- }
- offs+=numFaces;
- }
- return true;
- }
- /**This function extract an array of dmfLights from a DMF file.
- You must give in input a StringList representing a DMF file loaded with
- LoadFromFile and one array long enough. Please use GetDMFHeader() before this
- function to know number of dynamic lights.
- \return true if function succeed or false on fail.*/
- bool GetDMFLights(const StringList& RawFile/**<StringList representing a DMF file.*/,
- dmfLight lights[]/**<Lights returned.*/
- )
- {
- int offs=3;
- StringList temp,temp1;
- //Checking if this is a DeleD map File of version >= 0.91
- temp=SubdivideString(RawFile[0],";");//file info
- if ( temp[0] != "DeleD Map File" )
- return false;//not a deled file
- temp.clear();
- temp=SubdivideString(RawFile[1]," ");//get version
- temp1=SubdivideString(temp[1],";");
- if (atof(temp1[0].c_str()) < 0.91)
- return false;//not correct version
- //end checking
- temp.clear();
- temp1.clear();
- offs=offs + atoi(RawFile[offs].c_str());
- offs++;
- s32 objs = atoi(RawFile[offs].c_str());
- s32 lit=0;
- s32 d_lit=0;
- offs++;
- //let's get position of lights in file
- int i;
- for(i=0;i<objs;i++)
- {
- offs++;
- offs = offs + atoi(RawFile[offs].c_str());
- offs++;
- offs = offs + atoi(RawFile[offs].c_str());
- offs++;
- }
- //let's find dynamic lights
- lit = atoi(RawFile[offs].c_str());
- for(i=0;i<lit;i++)
- {
- offs++;
- temp=SubdivideString(RawFile[offs],";");
- if(atoi(temp[0].c_str())==1)
- {
- temp1=SubdivideString(temp[18],"_");
- if(temp1[0]=="dynamic")
- {
- lights[d_lit].radius = (float)atof(temp[4].c_str());
- lights[d_lit].pos.set((float)atof(temp[5].c_str()),
- (float)atof(temp[6].c_str()),
- (float)-atof(temp[7].c_str()));
- lights[d_lit].diffuseColor = video::SColorf(
- video::SColor(255, atoi(temp[10].c_str()), atoi(temp[11].c_str()),
- atoi(temp[12].c_str())));
- lights[d_lit].specularColor = video::SColorf(
- video::SColor(255, atoi(temp[13].c_str()), atoi(temp[14].c_str()),
- atoi(temp[15].c_str())));
- d_lit++;
- }
- }
- temp.clear();
- temp1.clear();
- }
- return true;
- }
- /**This function extracts an array of dmfWaterPlane,dmfVert and dmfFace from a DMF file.
- You must give in input a StringList representing a DMF file loaded with LoadFromFile and three arrays long enough.
- Please use GetDMFHeader() before this function to know number of water plains and water faces as well as water vertices.
- \return true if function succeed or false on fail.*/
- bool GetDMFWaterPlanes(const StringList& RawFile/**<StringList representing a DMF file.*/,
- dmfWaterPlane wat_planes[]/**<Water planes returned.*/,
- dmfVert vertices[]/**<Vertices returned*/,
- dmfFace faces[]/**Faces returned*/
- )
- {
- int offs=3;
- int offs1=0;
- StringList temp,temp1;
- //Checking if this is a DeleD map File of version >= 0.91
- temp=SubdivideString(RawFile[0],";");//file info
- if ( temp[0] != "DeleD Map File" )
- return false;//not a deled file
- temp.clear();
- temp=SubdivideString(RawFile[1]," ");//get version
- temp1=SubdivideString(temp[1],";");
- if (atof(temp1[0].c_str()) < 0.91)
- return false;//not correct version
- //end checking
- temp.clear();
- temp1.clear();
- offs=offs+atoi(RawFile[offs].c_str());
- offs++;
- s32 objs=atoi(RawFile[offs].c_str());
- s32 fac=0,vert=0,tmp_sz=0,vert_cnt=0,face_cnt=0,wat_id=0;
- core::dimension2d<u32> tilenum(40,40);
- f32 waveheight=3.0f;
- f32 wavespeed=300.0f;
- f32 wavelength=80.0f;
- offs++;
- for(int i=0;i<objs;i++)
- {
- StringList wat=SubdivideString(RawFile[offs],";");
- StringList wat1=SubdivideString(wat[0],"_");
- offs++;
- offs1=offs;
- offs=offs+atoi(RawFile[offs].c_str());
- offs++;
- offs1++;
- fac=atoi(RawFile[offs].c_str());
- offs++;
- if(wat1[0]=="water" && wat[2]=="0")
- {
- StringList userinfo=SubdivideString(wat[7],",");
- int j;
- for (j=0; j<(int)userinfo.size(); j++)
- {
- switch(j)
- {
- case 0:
- if(atoi(userinfo[0].c_str()))
- tilenum.Width = atoi(userinfo[0].c_str());
- break;
- case 1:
- if(atoi(userinfo[1].c_str()))
- tilenum.Height = atoi(userinfo[1].c_str());
- break;
- case 2:
- if(atof(userinfo[2].c_str()))
- waveheight = (float)atof(userinfo[2].c_str());
- break;
- case 3:
- if(atof(userinfo[3].c_str()))
- wavespeed = (float)atof(userinfo[3].c_str());
- break;
- case 4:
- if(atof(userinfo[4].c_str()))
- wavelength = (float)atof(userinfo[4].c_str());
- break;
- }
- }
- wat_planes[wat_id].waterID=wat_id;
- wat_planes[wat_id].numFaces=fac;
- wat_planes[wat_id].firstFace=face_cnt;
- wat_planes[wat_id].tileNum=tilenum;
- wat_planes[wat_id].waveHeight=waveheight;
- wat_planes[wat_id].waveSpeed=wavespeed;
- wat_planes[wat_id].waveLength=wavelength;
- for(j=0;j<fac;j++)
- {
- temp=SubdivideString(RawFile[offs+j],";");
- //first value is vertices number for this face
- faces[face_cnt].numVerts=atoi(temp[0].c_str());
- vert=faces[face_cnt].numVerts;
- //second is material ID
- faces[face_cnt].materialID=atoi(temp[1].c_str());
- //vertices are ordined
- faces[face_cnt].firstVert=vert_cnt;
- //now we'll create vertices structure
- for(int k=0;k<vert;k++)
- {
- //get vertex position
- temp1=SubdivideString(RawFile[offs1+atoi(temp[2+k].c_str())], ";");
- //copy x,y,z values
- vertices[vert_cnt].pos.set((float)atof(temp1[0].c_str()),
- (float)atof(temp1[1].c_str()),
- (float)-atof(temp1[2].c_str()));
- //get uv coords for tex and light if any
- vertices[vert_cnt].tc.set((float)atof(temp[2+vert+(2*k)].c_str()),
- (float)atof(temp[2+vert+(2*k)+1].c_str()));
- tmp_sz=temp.size();
- vertices[vert_cnt].lc.set((float)atof(temp[tmp_sz-(2*vert)+(2*k)].c_str()),
- (float)atof(temp[tmp_sz-(2*vert)+(2*k)+1].c_str()));
- ++vert_cnt;
- temp1.clear();
- }
- ++face_cnt;
- temp.clear();
- }
- }
- offs=offs+fac;
- }
- return true;
- }
- } // end namespace
- } // end namespace scene
- } // end namespace irr
- #endif /* __DMF_SUPPORT_H__ */
|