The ground is a procedurally generated height map using the image below. Unfortunately, my fragment shader for the ground ran into problems and I was unable to fix it in time, I defaulted to use the same fragment shader as the one used for the fish. In addition, the calculated normals need to be revisted as well.
The fish are populated by the "school" class. This class manages all the fish. Each fish is assigned its individual class that then checks neighboring fish to adjust its velocity and position. The algorithm used for boids was followed using this tutorial (https://processing.org/examples/flocking.html). I ran out of time to adjust the rotation of fish to match the direction of its velocity.
Although I didn't have enough time to implement it, my intention was to use the assets below to make these fish look more interesting