123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include "vc.c"
- #define WIDTH 960
- #define HEIGHT 720
- static uint32_t pixels1[WIDTH*HEIGHT];
- static float zbuffer1[WIDTH*HEIGHT];
- static uint32_t pixels2[WIDTH*HEIGHT];
- static float zbuffer2[WIDTH*HEIGHT];
- typedef struct {
- float x, y;
- } Vector2;
- Vector2 make_vector2(float x, float y)
- {
- Vector2 v2;
- v2.x = x;
- v2.y = y;
- return v2;
- }
- typedef struct {
- float x, y, z;
- } Vector3;
- static Vector3 make_vector3(float x, float y, float z)
- {
- Vector3 v3;
- v3.x = x;
- v3.y = y;
- v3.z = z;
- return v3;
- }
- static Vector2 project_3d_2d(Vector3 v3)
- {
- return make_vector2(v3.x / v3.z, v3.y / v3.z);
- }
- static Vector2 project_2d_scr(Vector2 v2)
- {
- return make_vector2((v2.x + 1)/2*WIDTH, (1 - (v2.y + 1)/2)*HEIGHT);
- }
- static float global_time = 1.0;
- #define PI 3.14159265359
- float sinf(float);
- float cosf(float);
- Olivec_Canvas vc_render(float dt)
- {
- global_time += dt;
- Olivec_Canvas oc1 = olivec_canvas(pixels1, WIDTH, HEIGHT, WIDTH);
- olivec_fill(oc1, 0xFF181818);
- Olivec_Canvas zb1 = olivec_canvas((uint32_t*)zbuffer1, WIDTH, HEIGHT, WIDTH);
- olivec_fill(zb1, 0);
- float z = 1.5;
- float t = 0.75;
- {
- Vector3 v1 = make_vector3(cosf(global_time)*t, -t, z + sinf(global_time)*t);
- Vector3 v2 = make_vector3(cosf(global_time + PI)*t, -t, z + sinf(global_time + PI)*t);
- Vector3 v3 = make_vector3(0, t, z);
- Vector2 p1 = project_2d_scr(project_3d_2d(v1));
- Vector2 p2 = project_2d_scr(project_3d_2d(v2));
- Vector2 p3 = project_2d_scr(project_3d_2d(v3));
- olivec_triangle3z(zb1, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 1.0f/v1.z, 1.0f/v2.z, 1.0f/v3.z);
- olivec_triangle3c(oc1, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
- }
- Olivec_Canvas oc2 = olivec_canvas(pixels2, WIDTH, HEIGHT, WIDTH);
- olivec_fill(oc2, 0xFF181818);
- Olivec_Canvas zb2 = olivec_canvas((uint32_t*)zbuffer2, WIDTH, HEIGHT, WIDTH);
- olivec_fill(zb2, 0);
- {
- Vector3 v1 = make_vector3(cosf(global_time + PI/2)*t, -t, z + sinf(global_time + PI/2)*t);
- Vector3 v2 = make_vector3(cosf(global_time + PI + PI/2)*t, -t, z + sinf(global_time + PI + PI/2)*t);
- Vector3 v3 = make_vector3(0, t, z);
- Vector2 p1 = project_2d_scr(project_3d_2d(v1));
- Vector2 p2 = project_2d_scr(project_3d_2d(v2));
- Vector2 p3 = project_2d_scr(project_3d_2d(v3));
- olivec_triangle3z(zb2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 1.0f/v1.z, 1.0f/v2.z, 1.0f/v3.z);
- olivec_triangle3c(oc2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
- }
- for (size_t y = 0; y < HEIGHT; ++y) {
- for (size_t x = 0; x < WIDTH; ++x) {
- float z1 = *(float*)&OLIVEC_PIXEL(zb1, x, y);
- float z2 = *(float*)&OLIVEC_PIXEL(zb2, x, y);
- if (z1 < z2) {
- OLIVEC_PIXEL(oc1, x, y) = OLIVEC_PIXEL(oc2, x, y);
- z1 = z2;
- }
- z1 = 1.0f/z1;
- if (z1 >= 1.0) {
- z1 -= 1.0;
- uint32_t v = z1*255;
- if (v > 255) v = 255;
- olivec_blend_color(&OLIVEC_PIXEL(oc1, x, y), (v<<(3*8)));
- }
- }
- }
- return oc1;
- }
|