triangle3d.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #define SCALE_DOWN_FACTOR 20
  2. #include "../demos/vc.c"
  3. #define WIDTH 800
  4. #define HEIGHT 600
  5. uint32_t pixels[WIDTH*HEIGHT];
  6. typedef struct {
  7. float x, y;
  8. } Vector2;
  9. Vector2 make_vector2(float x, float y)
  10. {
  11. Vector2 v2;
  12. v2.x = x;
  13. v2.y = y;
  14. return v2;
  15. }
  16. typedef struct {
  17. float x, y, z;
  18. } Vector3;
  19. Vector3 make_vector3(float x, float y, float z)
  20. {
  21. Vector3 v3;
  22. v3.x = x;
  23. v3.y = y;
  24. v3.z = z;
  25. return v3;
  26. }
  27. Vector2 project_3d_2d(Vector3 v3)
  28. {
  29. return make_vector2(v3.x / v3.z, v3.y / v3.z);
  30. }
  31. Vector2 project_2d_scr(Vector2 v2)
  32. {
  33. return make_vector2((v2.x + 1)/2*WIDTH, (1 - (v2.y + 1)/2)*HEIGHT);
  34. }
  35. float global_time = 0;
  36. #define PI 3.14159265359
  37. float sinf(float);
  38. float cosf(float);
  39. Olivec_Canvas render(float dt)
  40. {
  41. global_time += dt;
  42. Olivec_Canvas oc = olivec_canvas(pixels, WIDTH, HEIGHT, WIDTH);
  43. olivec_fill(oc, 0xFF181818);
  44. float z = 1.5;
  45. {
  46. Vector2 p1 = project_2d_scr(project_3d_2d(make_vector3(cosf(global_time)*0.5, -0.5, z + sinf(global_time)*0.5)));
  47. Vector2 p2 = project_2d_scr(project_3d_2d(make_vector3(cosf(global_time + PI)*0.5, -0.5, z + sinf(global_time + PI)*0.5)));
  48. Vector2 p3 = project_2d_scr(project_3d_2d(make_vector3(0, 0.5, z)));
  49. olivec_triangle3(oc, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
  50. }
  51. #if 0
  52. {
  53. Vector2 p1 = project_2d_scr(project_3d_2d(make_vector3(cosf(global_time + PI/2)*0.5, -0.5, z + sinf(global_time + PI/2)*0.5)));
  54. Vector2 p2 = project_2d_scr(project_3d_2d(make_vector3(cosf(global_time + PI + PI/2)*0.5, -0.5, z + sinf(global_time + PI + PI/2)*0.5)));
  55. Vector2 p3 = project_2d_scr(project_3d_2d(make_vector3(0, 0.5, z)));
  56. olivec_triangle3(oc, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
  57. }
  58. #endif
  59. return oc;
  60. }