remove_coll_limit.patch

tdev, 12/17/2009 11:57 am

Download (4.4 kB)

collisions.cpp (working copy)
117 117
#ifdef LUASCRIPT
118 118
	lua=mlua;
119 119
#endif
120
	resizeCells(1000); // previous default value was 10k, lowered it a bit
120 121
	free_collision_box=0;
121 122
	free_collision_tri=0;
122 123
	free_eventsource=0;
......
131 132
	loadDefaultModels();
132 133
}
133 134

  
135
void Collisions::resizeCells(int newsize)
136
{
137
	int oldsize = cells.size();
138
	cells.resize(newsize);
139
	if(debugMode)
140
	{
141
		Ogre::LogManager::getSingleton().logMessage("COLL: cell limit of " + StringConverter::toString(oldsize) + " reached. Increasing limit by 1000.");
142
		Ogre::LogManager::getSingleton().logMessage("COLL: cell memory is now " + StringConverter::toString(cells.size() * sizeof(cell_t) / 1024.0f) + " kB big");
143
	}
144
	if(oldsize > (int)cells.size())
145
	{
146
		for(int i=oldsize-1;i<(int)cells.size();i++)
147
		{
148
			memset(&cells[i], 0xff, sizeof(cell_t));
149
			//for(int j=0;j<CELL_BLOCKSIZE;j++)
150
			//	cells[i].element[j] = UNUSED_CELLELEMENT;
151
			cells[i].next=0;
152
			cells[i].free=0;
153
		}
154
	}
155
}
156

  
134 157
void Collisions::loadDefaultModels()
135 158
{
136 159
	FILE *fd;
......
322 345

  
323 346
	if (hashtable[pos].cellid==UNUSED_CELLID)
324 347
	{
325
		if (free_cell<MAX_CELLS)
348
		if (free_cell + 10>=(int)cells.size())
326 349
		{
327
			//create a new cell
328
			hashtable[pos].cellid=cellid;
329
			hashtable[pos].cell=&cells[free_cell];
330
			cells[free_cell].free=1;
331
			cells[free_cell].element[0]=value;
332
			cells[free_cell].next=0;
333
			if (pos!=hashfunc(cellid)) collision_count++;
334
			if (cells[free_cell].free>largest_cellcount) largest_cellcount=cells[free_cell].free;
335
			free_cell++;
350
			int oldsize = cells.size();
351
			resizeCells(cells.size() + 1000);
336 352
		}
337
		else
338
		{
339
			if(debugMode)
340
				Ogre::LogManager::getSingleton().logMessage("COLL: not enough cells available");
341
		}
353
		//create a new cell
354
		hashtable[pos].cellid=cellid;
355
		hashtable[pos].cell=&cells[free_cell];
356
		cells[free_cell].free=1;
357
		cells[free_cell].element[0]=value;
358
		cells[free_cell].next=0;
359
		if (pos!=hashfunc(cellid)) collision_count++;
360
		if (cells[free_cell].free>largest_cellcount) largest_cellcount=cells[free_cell].free;
361
		free_cell++;
342 362
	}
343 363
	else if (hashtable[pos].cellid==cellid)
344 364
	{
......
625 645
{
626 646
	LogManager::getSingleton().logMessage("COLL: Collision system statistics:");
627 647
	LogManager::getSingleton().logMessage("COLL: Cell size: "+StringConverter::toString((float)CELL_SIZE)+" m");
628
	LogManager::getSingleton().logMessage("COLL: Hashtable occupation: "+StringConverter::toString(free_cell)+"/"+StringConverter::toString(MAX_CELLS)+" ("+StringConverter::toString(100.0f*free_cell/(MAX_CELLS))+"%)");
648
	LogManager::getSingleton().logMessage("COLL: Amount of Cells: " + StringConverter::toString(cells.size()));
649
	LogManager::getSingleton().logMessage("COLL: Cell memory is now " + StringConverter::toString(cells.size() * sizeof(cell_t) / 1024.0f) + " kB big");
650
	LogManager::getSingleton().logMessage("COLL: Hashtable occupation: "+StringConverter::toString(free_cell)+"/"+StringConverter::toString(cells.size())+" ("+StringConverter::toString(100.0f*free_cell/(cells.size()))+"%)");
629 651
	LogManager::getSingleton().logMessage("COLL: Hashtable collisions: "+StringConverter::toString(collision_count));
630 652
	LogManager::getSingleton().logMessage("COLL: Largest cell: "+StringConverter::toString(largest_cellcount)+"/"+StringConverter::toString(CELL_BLOCKSIZE)+" ("+StringConverter::toString(100.0f*largest_cellcount/CELL_BLOCKSIZE)+"%)");
631

  
632 653
}
633 654

  
634 655

  
collisions.h (working copy)
35 35
//how many elements per cell? power of 2 minus 2 is better
36 36
#define CELL_BLOCKSIZE 126
37 37
//how many cells in the pool? Increase in case of sparce distribution of objects
38
#define MAX_CELLS 10000
38
//#define MAX_CELLS 10000 // moved to std::vector, no more limit
39 39
#define UNUSED_CELLID 0xFFFFFFFF
40 40
#define UNUSED_CELLELEMENT 0xFFFFFFFF
41 41
//terrain size is limited to 327km x 327km:
......
174 174
	//collision hashtable
175 175
	hash_t hashtable[1<<HASH_SIZE];
176 176
	//cell pool
177
	cell_t cells[MAX_CELLS];
177
	std::vector<cell_t> cells;
178 178
	int free_cell;
179 179

  
180 180
	eventsource_t eventsources[MAX_EVENTSOURCE];
......
198 198
	void hash_free(int cell_x, int cell_z, int value);
199 199
	cell_t *hash_find(int cell_x, int cell_z);
200 200
	unsigned int hashfunc(unsigned int cellid);
201
	void resizeCells(int newsize);
201 202

  
202 203
public:
203 204
	bool forcecam;