Bläddra i källkod

Add Triangle 3D demo

rexim 3 år sedan
förälder
incheckning
eb9a89e85f
4 ändrade filer med 80 tillägg och 0 borttagningar
  1. 1 0
      build.sh
  2. 74 0
      demos/triangle3d.c
  3. 5 0
      index.html
  4. BIN
      wasm/triangle3d.wasm

+ 1 - 0
build.sh

@@ -27,4 +27,5 @@ mkdir -p ./build/assets/
 build_vc_demo triangle &
 build_vc_demo 3d &
 build_vc_demo squish &
+build_vc_demo triangle3d &
 wait # TODO: the whole script must fail if one of the jobs fails

+ 74 - 0
demos/triangle3d.c

@@ -0,0 +1,74 @@
+#define SCALE_DOWN_FACTOR 20
+#include "../demos/vc.c"
+
+#define WIDTH 800
+#define HEIGHT 600
+uint32_t pixels[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;
+
+Vector3 make_vector3(float x, float y, float z)
+{
+    Vector3 v3;
+    v3.x = x;
+    v3.y = y;
+    v3.z = z;
+    return v3;
+}
+
+Vector2 project_3d_2d(Vector3 v3)
+{
+    return make_vector2(v3.x / v3.z, v3.y / v3.z);
+}
+
+Vector2 project_2d_scr(Vector2 v2)
+{
+    return make_vector2((v2.x + 1)/2*WIDTH, (1 - (v2.y + 1)/2)*HEIGHT);
+}
+
+float global_time = 0;
+
+#define PI 3.14159265359
+
+float sinf(float);
+float cosf(float);
+
+Olivec_Canvas render(float dt)
+{
+    global_time += dt;
+
+    Olivec_Canvas oc = olivec_canvas(pixels, WIDTH, HEIGHT, WIDTH);
+    olivec_fill(oc, 0xFF181818);
+
+    float z = 1.5;
+    {
+        Vector2 p1 = project_2d_scr(project_3d_2d(make_vector3(cosf(global_time)*0.5, -0.5, z + sinf(global_time)*0.5)));
+        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)));
+        Vector2 p3 = project_2d_scr(project_3d_2d(make_vector3(0, 0.5, z)));
+        olivec_triangle3(oc, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
+    }
+
+    {
+        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)));
+        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)));
+        Vector2 p3 = project_2d_scr(project_3d_2d(make_vector3(0, 0.5, z)));
+        olivec_triangle3(oc, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0xFF1818FF, 0xFF18FF18, 0xFFFF1818);
+    }
+
+    
+    return oc;
+}

+ 5 - 0
index.html

@@ -22,11 +22,16 @@
     <p>Resizing images on the fly. Source:&nbsp;<a href="https://github.com/tsoding/olive.c/blob/master/demos/squish.c">demos/squish.c</a></p>
     <canvas id="app-squish"></canvas>
 
+    <h2 id="demo-triangle3d"><a href="#demo-triangle3d">Triangle 3D</h2>
+    <canvas id="app-triangle3d"></canvas>
+
     <script src="js/vc.js"></script>
     <script>
       startDemo("app-triangle", "./wasm/triangle.wasm");
       startDemo("app-3d", "./wasm/3d.wasm");
       startDemo("app-squish", "./wasm/squish.wasm");
+      startDemo("app-triangle3d", "./wasm/triangle3d.wasm");
+      startDemo("app-squish", "./wasm/squish.wasm");
     </script>
   </body>
 </html>

BIN
wasm/triangle3d.wasm