cybersun
[dosdemo] / src / scr / cybersun.c
1 #include <stdio.h>
2 #include <math.h>
3 #include "demo.h"
4 #include "3dgfx.h"
5 #include "screen.h"
6 #include "gfxutil.h"
7 #include "mesh.h"
8 #include "image.h"
9
10 static int init(void);
11 static void destroy(void);
12 static void start(long trans_time);
13 static void draw(void);
14
15 static struct screen scr = {
16         "cybersun",
17         init,
18         destroy,
19         start,
20         0,
21         draw
22 };
23
24 static float cam_theta = 0, cam_phi = 10;
25 static float cam_dist = 0;
26
27 static struct g3d_mesh gmesh;
28 #define GMESH_GRIDSZ    25
29 #define GMESH_SIZE              128
30 static struct image gtex;
31
32 struct screen *cybersun_screen(void)
33 {
34         return &scr;
35 }
36
37 static int init(void)
38 {
39         int i, j;
40
41         if(gen_plane_mesh(&gmesh, GMESH_SIZE, GMESH_SIZE, GMESH_GRIDSZ, GMESH_GRIDSZ) == -1) {
42                 return -1;
43         }
44         for(i=0; i<gmesh.vcount; i++) {
45                 gmesh.varr[i].u *= GMESH_GRIDSZ;
46                 gmesh.varr[i].v *= GMESH_GRIDSZ;
47         }
48         if(load_image(&gtex, "data/pgrid.png") == -1) {
49                 return -1;
50         }
51
52         return 0;
53 }
54
55 static void destroy(void)
56 {
57         destroy_mesh(&gmesh);
58         destroy_image(&gtex);
59 }
60
61 static void start(long trans_time)
62 {
63         g3d_matrix_mode(G3D_PROJECTION);
64         g3d_load_identity();
65         g3d_perspective(50.0, 1.3333333, 0.5, 500.0);
66
67         g3d_enable(G3D_CULL_FACE);
68
69         g3d_clear_color(0, 0, 0);
70 }
71
72 static void update(void)
73 {
74         int i, j;
75         float t = time_msec / 1000.0f;
76         struct g3d_vertex *vptr;
77
78         mouse_orbit_update(&cam_theta, &cam_phi, &cam_dist);
79
80         /* update mesh */
81         vptr = gmesh.varr;
82         for(i=0; i<GMESH_GRIDSZ + 1; i++) {
83                 for(j=0; j<GMESH_GRIDSZ + 1; j++) {
84                         float u = (float)j / GMESH_GRIDSZ - 0.5f;
85                         float v = (float)i / GMESH_GRIDSZ - 0.5f;
86                         float x = u * 32.0f;
87                         float y = v * 32.0f;
88                         float r = sqrt(x * x + y * y);
89
90                         vptr->z = sin(x * 0.5 + t) + cos(x * 0.8f) * 0.5f;
91                         vptr->z += cos(y * 0.5 + t);
92                         vptr->z += sin(r + t) * 0.5f;
93                         vptr->z *= r * 0.1f > 1.0f ? 1.0f : r * 0.1f;
94                         vptr++;
95                 }
96         }
97 }
98
99 static void draw(void)
100 {
101         int i;
102
103         update();
104
105         g3d_matrix_mode(G3D_MODELVIEW);
106         g3d_load_identity();
107         g3d_translate(0, -2, -cam_dist);
108         g3d_rotate(cam_phi, 1, 0, 0);
109         g3d_rotate(cam_theta, 0, 1, 0);
110         if(opt.sball) {
111                 g3d_mult_matrix(sball_matrix);
112         }
113
114         g3d_clear(G3D_COLOR_BUFFER_BIT | G3D_DEPTH_BUFFER_BIT);
115
116         g3d_set_texture(gtex.width, gtex.height, gtex.pixels);
117         g3d_enable(G3D_TEXTURE_2D);
118         g3d_enable(G3D_DEPTH_TEST);
119
120         g3d_push_matrix();
121         g3d_rotate(-90, 1, 0, 0);
122         draw_mesh(&gmesh);
123         g3d_pop_matrix();
124
125         g3d_disable(G3D_DEPTH_TEST);
126         g3d_disable(G3D_TEXTURE_2D);
127
128         swap_buffers(fb_pixels);
129 }