+qboolean MiniMapEvaluateSampleOffsets(int *bestj, int *bestk, float *bestval)
+{
+ float val, dx, dy;
+ int j, k;
+
+ *bestj = *bestk = -1;
+ *bestval = 3; /* max possible val is 2 */
+
+ for(j = 0; j < minimap.samples; ++j)
+ for(k = j + 1; k < minimap.samples; ++k)
+ {
+ dx = minimap.sample_offsets[2*j+0] - minimap.sample_offsets[2*k+0];
+ dy = minimap.sample_offsets[2*j+1] - minimap.sample_offsets[2*k+1];
+ if(dx > +0.5) dx -= 1;
+ if(dx < -0.5) dx += 1;
+ if(dy > +0.5) dy -= 1;
+ if(dy < -0.5) dy += 1;
+ val = dx * dx + dy * dy;
+ if(val < *bestval)
+ {
+ *bestj = j;
+ *bestk = k;
+ *bestval = val;
+ }
+ }
+
+ return *bestval < 3;
+}
+
+void MiniMapMakeSampleOffsets()
+{
+ int i, j, k, jj, kk;
+ float val, valj, valk, dx, dy, sx, sy, rx, ry;
+
+ Sys_Printf( "Generating good sample offsets (this may take a while)...\n" );
+
+ /* start with entirely random samples */
+ for(i = 0; i < minimap.samples; ++i)
+ {
+ minimap.sample_offsets[2*i+0] = Random();
+ minimap.sample_offsets[2*i+1] = Random();
+ }
+
+ for(i = 0; i < 1000; ++i)
+ {
+ if(MiniMapEvaluateSampleOffsets(&j, &k, &val))
+ {
+ sx = minimap.sample_offsets[2*j+0];
+ sy = minimap.sample_offsets[2*j+1];
+ minimap.sample_offsets[2*j+0] = rx = Random();
+ minimap.sample_offsets[2*j+1] = ry = Random();
+ if(!MiniMapEvaluateSampleOffsets(&jj, &kk, &valj))
+ valj = -1;
+ minimap.sample_offsets[2*j+0] = sx;
+ minimap.sample_offsets[2*j+1] = sy;
+
+ sx = minimap.sample_offsets[2*k+0];
+ sy = minimap.sample_offsets[2*k+1];
+ minimap.sample_offsets[2*k+0] = rx;
+ minimap.sample_offsets[2*k+1] = ry;
+ if(!MiniMapEvaluateSampleOffsets(&jj, &kk, &valk))
+ valk = -1;
+ minimap.sample_offsets[2*k+0] = sx;
+ minimap.sample_offsets[2*k+1] = sy;
+
+ if(valj > valk)
+ {
+ if(valj > val)
+ {
+ /* valj is the greatest */
+ minimap.sample_offsets[2*j+0] = rx;
+ minimap.sample_offsets[2*j+1] = ry;
+ i = -1;
+ Sys_Printf("%f\n", val);
+ }
+ else
+ {
+ /* valj is the greater and it is useless - forget it */
+ }
+ }
+ else
+ {
+ if(valk > val)
+ {
+ /* valk is the greatest */
+ minimap.sample_offsets[2*k+0] = rx;
+ minimap.sample_offsets[2*k+1] = ry;
+ i = -1;
+ Sys_Printf("%f\n", val);
+ }
+ else
+ {
+ /* valk is the greater and it is useless - forget it */
+ }
+ }
+ }
+ else
+ break;
+ }
+}
+