+ gp->normals[index].x = xd;
+ gp->normals[index].y = yd;
+ gp->normals[index].z = zd;
+
+ offset_x = 0.0;
+ offset_y = 0.0;
+ offset_z = 0.0;
+ strength = 0.0;
+ for ( i = 0; i < field_points; i++)
+ {
+ xdist = gp->field_data[i].pos.x - xd;
+ ydist = gp->field_data[i].pos.y - yd;
+ zdist = gp->field_data[i].pos.z - zd;
+ dist = field_array_size * (xdist * xdist + ydist * ydist
+ + zdist * zdist) * 0.1;
+
+ strength += PI * gp->field_data[i].apower;
+
+ if (dist < field_array_size)
+ {
+ offset_x += xd * gp->field_data[i].apower * gp->field[dist];
+ offset_y += yd * gp->field_data[i].apower * gp->field[dist];
+ offset_z += zd * gp->field_data[i].apower * gp->field[dist];
+
+ gp->blob_force.x += 1.0 * xd * gp->field_data[i].apower * gp->field[dist];
+ gp->blob_force.y += 1.0 * yd * gp->field_data[i].apower * gp->field[dist];
+ gp->blob_force.z += 1.0 * zd * gp->field_data[i].apower * gp->field[dist];
+
+ strength *= 2.0 * gp->field[dist];
+ }
+
+ if (incremental)
+ {
+ xd += offset_x * gp->freak * gp->freak;
+ yd += offset_y * gp->freak * gp->freak;
+ zd += offset_z * gp->freak * gp->freak;
+ }
+ if (incremental == 1)
+ {
+ offset_x = 0.0;
+ offset_y = 0.0;
+ offset_z = 0.0;
+ }
+ }
+
+ if (incremental < 3)
+ {
+ xd += offset_x;
+ yd += offset_y;
+ zd += offset_z;
+ }
+ xd += gp->blob_center.x;
+ yd += gp->blob_center.y;
+ zd += gp->blob_center.z;
+
+ if (do_colour)
+ {
+ gp->colours[index].red = 128 + (int)(sin(strength + gp->colour_cycle * 0.01 + 2.0 * PI * x / gp->row_data[y].num_x_points) * 127.0);
+ gp->colours[index].green = 128 + (int)(cos(strength + gp->colour_cycle * 0.025) * 127.0);
+ gp->colours[index].blue = 128 + (int)(sin(strength + gp->colour_cycle * 0.03 + 2.0 * PI * y / y_resolution) * 127.0);
+ gp->colours[index].alpha = (int)(255.0 * fade);
+ }
+
+ /* Add walls */
+ if (do_walls)
+ {
+ if (zd < -limit) zd = -limit;
+ if (zd > limit) zd = limit;
+
+ dist = field_array_size * (zd + limit) * (zd + limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ xd += (xd - gp->blob_center.x) * gp->wall_field[dist];
+ yd += (yd - gp->blob_center.y) * gp->wall_field[dist];
+ gp->blob_force.z += (zd + limit);
+ }
+ else
+ {
+ dist = field_array_size * (zd - limit) * (zd - limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ xd += (xd - gp->blob_center.x) * gp->wall_field[dist];
+ yd += (yd - gp->blob_center.y) * gp->wall_field[dist];
+ gp->blob_force.z -= (zd - limit);
+ }
+
+ if (yd < -limit) yd = -limit;
+ if (yd > limit) yd = limit;
+
+ dist = field_array_size * (yd + limit) * (yd + limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ xd += (xd - gp->blob_center.x) * gp->wall_field[dist];
+ zd += (zd - gp->blob_center.z) * gp->wall_field[dist];
+ gp->blob_force.y += (yd + limit);
+ }
+ else
+ {
+ dist = field_array_size * (yd - limit) * (yd - limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ xd += (xd - gp->blob_center.x) * gp->wall_field[dist];
+ zd += (zd - gp->blob_center.z) * gp->wall_field[dist];
+ gp->blob_force.y -= (yd - limit);
+ }
+ }
+
+ if (xd < -limit) xd = -limit;
+ if (xd > limit) xd = limit;
+
+ dist = field_array_size * (xd + limit) * (xd + limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ yd += (yd - gp->blob_center.y) * gp->wall_field[dist];
+ zd += (zd - gp->blob_center.z) * gp->wall_field[dist];
+ gp->blob_force.x += (xd + limit);
+ }
+ else
+ {
+ dist = field_array_size * (xd - limit) * (xd - limit) * 0.5;
+ if (dist < field_array_size)
+ {
+ yd += (yd - gp->blob_center.y) * gp->wall_field[dist];
+ zd += (zd - gp->blob_center.z) * gp->wall_field[dist];
+ gp->blob_force.x -= (xd - limit);
+ }
+ }
+
+ if (yd < -limit) yd = -limit;
+ if (yd > limit) yd = limit;
+ }
+ }
+
+ gp->dots[index].x = xd;
+ gp->dots[index].y = yd;
+ gp->dots[index].z = zd;