063fb7864dcb965e3fe26afafd65da2c45932eb6
[dosdemo] / src / plasma.c
1 // Just a test with a run of the mill plasma
2
3 #include <stdlib.h>
4 #include <math.h>
5
6 #include "demo.h"
7 #include "screen.h"
8 #include "tinyfps.h"
9
10 static int init(void);
11 static void destroy(void);
12 static void start(long trans_time);
13 static void stop(long trans_time);
14 static void draw(void);
15
16 static struct screen scr = {
17         "plasma",
18         init,
19         destroy,
20         start,
21         stop,
22         draw
23 };
24
25 unsigned long startingTime;
26
27 #define PSIN_SIZE 4096
28 #define PPAL_SIZE 256
29
30 unsigned char *psin1, *psin2, *psin3;
31 unsigned short *plasmaPal;
32
33 unsigned short myBuffer[320*240];
34
35
36 struct screen *plasma_screen(void)
37 {
38         return &scr;
39 }
40
41 static int init(void)
42 {
43         int i;
44
45         initFpsFonts();
46
47         psin1 = (unsigned char*)malloc(sizeof(unsigned char) * PSIN_SIZE);
48         psin2 = (unsigned char*)malloc(sizeof(unsigned char) * PSIN_SIZE);
49         psin3 = (unsigned char*)malloc(sizeof(unsigned char) * PSIN_SIZE);
50
51         for (i = 0; i < PSIN_SIZE; i++)
52         {
53                 psin1[i] = (unsigned char)(sin((double)i / 45.0) * 63.0 + 63.0);
54                 psin2[i] = (unsigned char)(sin((double)i / 75.0) * 42.0 + 42.0);
55                 psin3[i] = (unsigned char)(sin((double)i / 32.0) * 88.0 + 88.0);
56         }
57
58         plasmaPal = (unsigned short*)malloc(sizeof(unsigned short) * PPAL_SIZE);
59         for (i=0; i<PPAL_SIZE; i++)
60         {
61                 int r, g, b;
62                 int c = i;
63                 if (c > 127) c = 255 - c;
64                 c >>= 2;
65                 g = 31 - c;
66                 r = c;
67                 b = g;
68                 plasmaPal[i] = (r<<11) | (g<<5) | b;
69         }
70
71         //return 0xCAFE;
72         return 0;
73 }
74
75 static void destroy(void)
76 {
77         free(psin1);
78         free(psin2);
79         free(psin3);
80 }
81
82 static void start(long trans_time)
83 {
84         startingTime = time_msec;
85 }
86
87 static void stop(long trans_time)
88 {
89 }
90
91 static void draw(void)
92 {
93         int x, y;
94         unsigned char c;
95         unsigned char s1, s2;
96
97         float dt = (float)(time_msec - startingTime) / 1000.0f;
98         int t1 = sin(0.1f * dt) * 132 + 132;
99         int t2 = sin(0.2f * dt) * 248 + 248;
100         int t3 = sin(0.5f * dt) * 380 + 380;
101
102         unsigned int *vram32 = (unsigned int*)vmem_back;
103         unsigned int p0, p1;
104         for (y = 0; y < fb_height; y++)
105         {
106                 s1 = psin2[y + t2];
107                 s2 = psin3[y + t1];
108                 for (x = 0; x < fb_width; x+=2)
109                 {
110                         c = psin1[x + t1] + s1 + psin3[x + y + t3] + psin1[psin2[x + t2] + s2 + t3];
111                         p0 = plasmaPal[c];
112                         c = psin1[x + 1 + t1] + s1 + psin3[x + 1 + y + t3] + psin1[psin2[x + 1 + t2] + s2 + t3];
113                         p1 = plasmaPal[c];
114
115                         *vram32++ = (p1 << 16) | p0;
116                 }
117         }
118
119         drawFps((unsigned short*)fb_pixels);
120
121         swap_buffers(0);
122 }