- // Draw 'fish'
- if( world.simulating )
- {
- float scaled_time = (vg_time-world.sim_start)*2.0f;
- float lerp = scaled_time - (float)world.sim_frame;
-
- v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
-
- for( int i = 0; i < world.num_fishes; i ++ )
- {
- struct fish *fish = &world.fishes[i];
-
- if( !fish->alive )
- continue;
-
- colour_code_v3( fish->payload, dot_colour );
- glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-
- // Evaluate position
- struct cell *cell = pcell(fish->pos);
- v2f fish_pos;
-
- v2f const curve_3[] = {{0.5f,1.0f},{0.5f,0.625f},{0.625f,0.5f},{1.0f,0.5f}};
- v2f const curve_6[] = {{0.5f,1.0f},{0.5f,0.625f},{0.375f,0.5f},{0.0f,0.5f}};
- v2f const curve_9[] = {{1.0f,0.5f},{0.625f,0.5f},{0.5f,0.375f},{0.5f,0.0f}};
- v2f const curve_12[]= {{0.0f,0.5f},{0.375f,0.5f},{0.5f,0.375f},{0.5f,0.0f}};
-
- v2f const curve_7[] = {{0.5f,0.8438f},{0.875f,0.8438f},{0.625f,0.5f},{1.0f,0.5f}};
- v2f const curve_7_1[] = {{0.5f,0.8438f},{1.0f-0.875f,0.8438f},{1.0-0.625f,0.5f},{0.0f,0.5f}};
-
- float const linear_section = 0.1562f;
-
- v2f const *curve;
-
- float t = lerp;
-
- switch( cell->config )
- {
- case 13:
- if( fish->dir[0] == 1 )
- curve = curve_12;
- else
- curve = curve_9;
- break;
- case 3: curve = curve_3; break;
- case 6: curve = curve_6; break;
- case 9: curve = curve_9; break;
- case 12: curve = curve_12; break;
- case 7:
- if( t > linear_section )
- {
- t -= linear_section;
- t *= (1.0f/(1.0f-linear_section));
-
- curve = cell->state & FLAG_FLIP_FLOP? curve_7: curve_7_1;
- }
- else curve = NULL;
- break;
- default: curve = NULL; break;
- }
-
- if( curve )
- {
- // bezier thing
- float t2 = t * t;
- float t3 = t * t * t;
-
- float cA = 3.0f*t2 - 3.0f*t3;
- float cB = 3.0f*t3 - 6.0f*t2 + 3.0f*t;
- float cC = 3.0f*t2 - t3 - 3.0f*t + 1.0f;
-
- fish_pos[0] = t3*curve[3][0] + cA*curve[2][0] + cB*curve[1][0] + cC*curve[0][0];
- fish_pos[1] = t3*curve[3][1] + cA*curve[2][1] + cB*curve[1][1] + cC*curve[0][1];
- fish_pos[0] += (float)fish->pos[0];
- fish_pos[1] += (float)fish->pos[1];
- }
- else
- {
- v2f origin;
- origin[0] = (float)fish->pos[0] + (float)fish->dir[0]*-0.5f + 0.5f;
- origin[1] = (float)fish->pos[1] + (float)fish->dir[1]*-0.5f + 0.5f;
-
- fish_pos[0] = origin[0] + (float)fish->dir[0]*t;
- fish_pos[1] = origin[1] + (float)fish->dir[1]*t;
- }
-
- vg_line_box( (v2f){fish->pos[0],fish->pos[1]},
- (v2f){ (float)fish->pos[0]+1.0f, (float)fish->pos[1]+1.0f }, 0xffffffff );
-
- glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), fish_pos[0], fish_pos[1], 0.125f );
- draw_mesh( 0, 32 );
- }
- }
-