10 static int init(void);
11 static void destroy(void);
12 static void start(long trans_time);
13 static void draw(void);
15 static struct screen scr = {
24 static float cam_theta = 0, cam_phi = 10;
25 static float cam_dist = 0;
27 static struct g3d_mesh gmesh;
28 #define GMESH_GRIDSZ 25
29 #define GMESH_SIZE 128
30 static struct image gtex;
32 struct screen *cybersun_screen(void)
41 if(gen_plane_mesh(&gmesh, GMESH_SIZE, GMESH_SIZE, GMESH_GRIDSZ, GMESH_GRIDSZ) == -1) {
44 for(i=0; i<gmesh.vcount; i++) {
45 gmesh.varr[i].u *= GMESH_GRIDSZ;
46 gmesh.varr[i].v *= GMESH_GRIDSZ;
48 if(load_image(>ex, "data/pgrid.png") == -1) {
55 static void destroy(void)
61 static void start(long trans_time)
63 g3d_matrix_mode(G3D_PROJECTION);
65 g3d_perspective(50.0, 1.3333333, 0.5, 500.0);
67 g3d_enable(G3D_CULL_FACE);
69 g3d_clear_color(0, 0, 0);
72 static void update(void)
75 float t = time_msec / 1000.0f;
76 struct g3d_vertex *vptr;
78 mouse_orbit_update(&cam_theta, &cam_phi, &cam_dist);
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;
88 float r = sqrt(x * x + y * y);
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;
99 static void draw(void)
105 g3d_matrix_mode(G3D_MODELVIEW);
107 g3d_translate(0, -2, -cam_dist);
108 g3d_rotate(cam_phi, 1, 0, 0);
109 g3d_rotate(cam_theta, 0, 1, 0);
111 g3d_mult_matrix(sball_matrix);
114 g3d_clear(G3D_COLOR_BUFFER_BIT | G3D_DEPTH_BUFFER_BIT);
116 g3d_set_texture(gtex.width, gtex.height, gtex.pixels);
117 g3d_enable(G3D_TEXTURE_2D);
118 g3d_enable(G3D_DEPTH_TEST);
121 g3d_rotate(-90, 1, 0, 0);
125 g3d_disable(G3D_DEPTH_TEST);
126 g3d_disable(G3D_TEXTURE_2D);
128 swap_buffers(fb_pixels);