コード例 #1
0
ファイル: TileAssembler.cpp プロジェクト: wow4all/wowtbc
				//=================================================================
				bool TileAssembler::readRawFile(std::string& pModelFilename,  ModelPosition& pModelPosition, AABSPTree<SubModel *> *pMainTree)
				{
					bool result = false;

					std::string filename = iSrcDir;
					if(filename.length() >0)
						filename.append("/");
					filename.append(pModelFilename);
					FILE *rf = fopen(filename.c_str(), "rb");
					if(!rf)
					{
						// depending on the extractor version, the data could be located in the root dir
						std::string baseModelFilename = pModelFilename.substr((pModelFilename.find_first_of("/")+1),pModelFilename.length());
						filename = iSrcDir;
						if(filename.length() >0)
							filename.append("/");
						filename.append(baseModelFilename);
						rf = fopen(filename.c_str(), "rb");
					}
					char ident[8];

					int trianglecount =0;

					#ifdef _ASSEMBLER_DEBUG
					int startgroup = 0;					 //2;
					int endgroup = INT_MAX;				 //2;
					fprintf(::g_df,"-------------------------------------------------\n");
					fprintf(::g_df,"%s\n", pModelFilename.c_str());
					fprintf(::g_df,"-------------------------------------------------\n");
					#else
					int startgroup = 0;
					int endgroup = INT_MAX;
					#endif

					if(rf)
					{
						if(fread(&ident, 8, 1, rf) != 1) { fclose(rf); return(false); }
						if(strcmp(ident, "VMAP001") == 0)
						{
							// OK, do nothing
						}
						else if(strcmp(ident, "VMAP002") == 0)
						{
							// we have to read one int. This is needed during the export and we have to skip it here
							int tempNVectors;
							if(fread(&tempNVectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }

						}
						else
						{
							// wrong version
							fclose(rf);
							return(false);
						}
						uint32 groups;
						char blockId[5];
						blockId[4] = 0;
						int blocksize;

						if(fread(&groups, sizeof(uint32), 1, rf) != 1) { fclose(rf); return(false); }

						for(int g=0;g<(int)groups;g++)
						{
							// group MUST NOT have more then 65536 indexes !! Array will have a problem with that !! (strange ...)
							Array<int> tempIndexArray;
							Array<Vector3> tempVertexArray;

							AABSPTree<Triangle> *gtree = new AABSPTree<Triangle>();

							uint32 flags;
							uint32 isindoor = 0;
							uint32 branches;
							if(fread(&flags, sizeof(uint32), 1, rf) != 1)
							{
								fclose(rf);
								return(false);
							}

							if(flags & 1) {
								if(fread(&isindoor, sizeof(uint32), 1, rf) != 1)
								{
									fclose(rf);
									return(false);
								}
							}

							if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); }
							if(strcmp(blockId, "GRP ") != 0)
							{
								if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); }
							}
							if(strcmp(blockId, "GRP ") != 0) { printf("BUG: (%s)\n",blockId); fclose(rf); return(false); }
							if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }
							if(fread(&branches, sizeof(uint32), 1, rf) != 1) { fclose(rf); return(false); }
							for(int b=0;b<(int)branches; b++)
							{
								uint32 indexes;
								// indexes for each branch (not used jet)
								if(fread(&indexes, sizeof(uint32), 1, rf) != 1) { fclose(rf); return(false); }
							}

							// ---- indexes
							if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); }
							if(strcmp(blockId, "INDX") != 0) { fclose(rf); return(false); }
							if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }
							unsigned int nindexes;
							if(fread(&nindexes, sizeof(uint32), 1, rf) != 1) { fclose(rf); return(false); }
							if(nindexes >0)
							{
								unsigned short *indexarray = new unsigned short[nindexes*sizeof(unsigned short)];
								if(fread(indexarray, sizeof(unsigned short), nindexes, rf) != nindexes) { fclose(rf); return(false); }
								for(int i=0;i<(int)nindexes; i++)
								{
									unsigned short val = indexarray[i];
									tempIndexArray.append(val);
								}
								delete indexarray;
							}

							// ---- vectors
							if(fread(&blockId, 4, 1, rf) != 1) {fclose(rf); return(false); }
							if(strcmp(blockId, "VERT") != 0) { fclose(rf); return(false); }
							if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }
							unsigned int nvectors;
							if(fread(&nvectors, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }
							float *vectorarray = 0;
							if(nvectors >0)
							{
								vectorarray = new float[nvectors*sizeof(float)*3];
								if(fread(vectorarray, sizeof(float)*3, nvectors, rf) != nvectors) { fclose(rf); return(false); }
							}
							// ----- liquit
							if(flags & 0x00001000)
							{
								// we have liquit -> not handled yet ... skip
								if(fread(&blockId, 4, 1, rf) != 1) { fclose(rf); return(false); }
								if(strcmp(blockId, "LIQU") != 0) { fclose(rf); return(false); }
								if(fread(&blocksize, sizeof(int), 1, rf) != 1) { fclose(rf); return(false); }
								fseek(rf, blocksize, SEEK_CUR);
							}

							for(unsigned int i=0, indexNo=0; indexNo<nvectors; indexNo++)
							{
								Vector3 v = Vector3(vectorarray[i+2], vectorarray[i+1], vectorarray[i+0]);
								i+=3;
								v = pModelPosition.transform(v);

								float swapy = v.y;
								v.y = v.x;
								v.x = swapy;

								tempVertexArray.append(v);
							}

							// ---- calculate triangles
							int rest = nindexes%3;
							if(rest != 0)
							{
								nindexes -= rest;
							}

							for(unsigned int i=0;i<(nindexes);)
							{
								Triangle t = Triangle(tempVertexArray[tempIndexArray[i+2]], tempVertexArray[tempIndexArray[i+1]], tempVertexArray[tempIndexArray[i+0]] );
								i+=3;
								++trianglecount;
								if(g>= startgroup && g <= endgroup)
								{
									gtree->insert(t);
								}
							}

							if(vectorarray != 0)
							{
								delete vectorarray;
							}

							if(gtree->size() >0)
							{
								gtree->balance();
								SubModel *sm = new SubModel(gtree);
								sm->setIndoorFlag( isindoor );
								#ifdef _ASSEMBLER_DEBUG
								if(::g_df) fprintf(::g_df,"group trianglies: %d, Tris: %d, Nodes: %d, gtree.triangles: %d\n", g, sm->getNTriangles(), sm->getNNodes(), gtree->memberTable.size());
								if(sm->getNTriangles() !=  gtree->memberTable.size())
								{
									if(::g_df) fprintf(::g_df,"ERROR !!!! group trianglies: %d, Tris: %d, Nodes: %d, gtree.triangles: %d\n", g, sm->getNTriangles(), sm->getNNodes(), gtree->memberTable.size());
								}
								#endif
								sm->setBasePosition(pModelPosition.iPos);
								pMainTree->insert(sm);
							}
							delete gtree;
						}
						fclose(rf);
						result = true;
					}
					return(result);
				}