rev |
line source |
nuclear@0
|
1 #include <math.h>
|
nuclear@0
|
2
|
nuclear@0
|
3 #include "main.h"
|
nuclear@0
|
4 #include "sky1.h"
|
nuclear@0
|
5
|
nuclear@0
|
6 unsigned char rbmp[ScreenSize];
|
nuclear@0
|
7 unsigned char gbmp[ScreenSize];
|
nuclear@0
|
8 unsigned char bbmp[ScreenSize];
|
nuclear@0
|
9
|
nuclear@0
|
10 unsigned char rbuffer[ScreenSize];
|
nuclear@0
|
11 unsigned char gbuffer[ScreenSize];
|
nuclear@0
|
12 unsigned char bbuffer[ScreenSize];
|
nuclear@0
|
13
|
nuclear@0
|
14 short radir0[ScreenSize];
|
nuclear@0
|
15 short radir1[ScreenSize];
|
nuclear@0
|
16 short radir2[ScreenSize];
|
nuclear@0
|
17
|
nuclear@0
|
18 short radir3[ScreenSize];
|
nuclear@0
|
19 short radir4[ScreenSize];
|
nuclear@0
|
20 short radir5[ScreenSize];
|
nuclear@0
|
21
|
nuclear@0
|
22 void InitRadialBitmap1()
|
nuclear@0
|
23 {
|
nuclear@0
|
24 int x, y, i = 0;
|
nuclear@0
|
25 unsigned short c;
|
nuclear@0
|
26 for (y=0; y<ScreenHeight; y++)
|
nuclear@0
|
27 {
|
nuclear@0
|
28 for (x=0; x<ScreenWidth; x ++)
|
nuclear@0
|
29 {
|
nuclear@0
|
30 c = sky1[(x&255) + (((ScreenHeight-1)-y)<<8)];
|
nuclear@0
|
31 rbmp[i] = ((c>>11) & 31) << 3;
|
nuclear@0
|
32 gbmp[i] = ((c>>5) & 63) << 2;
|
nuclear@0
|
33 bbmp[i] = (c & 31) << 3;
|
nuclear@0
|
34 i++;
|
nuclear@0
|
35 }
|
nuclear@0
|
36 }
|
nuclear@0
|
37 }
|
nuclear@0
|
38
|
nuclear@0
|
39 void InitRadialblur()
|
nuclear@0
|
40 {
|
nuclear@0
|
41 InitRadialBitmap1();
|
nuclear@0
|
42
|
nuclear@0
|
43 float rb_shortness = 4.0f;
|
nuclear@0
|
44
|
nuclear@0
|
45 int xi, yi;
|
nuclear@0
|
46 int i=0;
|
nuclear@0
|
47 int x, y;
|
nuclear@0
|
48 for (y=0; y<ScreenHeight; y++)
|
nuclear@0
|
49 {
|
nuclear@0
|
50 for (x=0; x<ScreenWidth; x++)
|
nuclear@0
|
51 {
|
nuclear@0
|
52 xi = (int)(-(x/rb_shortness));
|
nuclear@0
|
53 yi = (int)(-(y/rb_shortness));
|
nuclear@0
|
54 radir0[i] = (xi>>1) + (yi>>1)*ScreenWidth;
|
nuclear@0
|
55 radir1[i] = (xi>>2) + (yi>>2)*ScreenWidth;
|
nuclear@0
|
56 radir2[i] = (xi>>3) + (yi>>3)*ScreenWidth;
|
nuclear@0
|
57 i++;
|
nuclear@0
|
58 }
|
nuclear@0
|
59 }
|
nuclear@0
|
60
|
nuclear@0
|
61 i=0;
|
nuclear@0
|
62 for (y=0; y<ScreenHeight; y++)
|
nuclear@0
|
63 {
|
nuclear@0
|
64 for (x=0; x<ScreenWidth; x++)
|
nuclear@0
|
65 {
|
nuclear@0
|
66 xi = (int)(-(x/rb_shortness));
|
nuclear@0
|
67 yi = (int)(y/rb_shortness);
|
nuclear@0
|
68 radir3[i] = (xi>>1) + (yi>>1)*ScreenWidth;
|
nuclear@0
|
69 radir4[i] = (xi>>2) + (yi>>2)*ScreenWidth;
|
nuclear@0
|
70 radir5[i] = (xi>>3) + (yi>>3)*ScreenWidth;
|
nuclear@0
|
71 i++;
|
nuclear@0
|
72 }
|
nuclear@0
|
73 }
|
nuclear@0
|
74 }
|
nuclear@0
|
75
|
nuclear@0
|
76
|
nuclear@0
|
77 void InitRadialBitmapCopy()
|
nuclear@0
|
78 {
|
nuclear@0
|
79 int i;
|
nuclear@0
|
80 unsigned int *rbuffer32 = (unsigned int*)rbuffer, *gbuffer32 = (unsigned int*)gbuffer, *bbuffer32 = (unsigned int*)bbuffer;
|
nuclear@0
|
81 for (i=0; i<ScreenSize; i+=4)
|
nuclear@0
|
82 {
|
nuclear@0
|
83 *rbuffer32++ = rbmp[i] | (rbmp[i+1]<<8) | (rbmp[i+2]<<16) | (rbmp[i+3]<<24);
|
nuclear@0
|
84 *gbuffer32++ = gbmp[i] | (gbmp[i+1]<<8) | (gbmp[i+2]<<16) | (gbmp[i+3]<<24);
|
nuclear@0
|
85 *bbuffer32++ = bbmp[i] | (bbmp[i+1]<<8) | (bbmp[i+2]<<16) | (bbmp[i+3]<<24);
|
nuclear@0
|
86 }
|
nuclear@0
|
87 }
|
nuclear@0
|
88
|
nuclear@0
|
89 void Radial(int ntime, unsigned short *vram)
|
nuclear@0
|
90 {
|
nuclear@0
|
91 int i,ri;
|
nuclear@0
|
92
|
nuclear@0
|
93 int dcx = (int)(sin((float)ntime/23.0f)*(ScreenWidth>>1));
|
nuclear@0
|
94 int dcy = (int)(sin((float)ntime/32.0f)*(ScreenHeight>>1));
|
nuclear@0
|
95 int dci = dcx + dcy*ScreenWidth;
|
nuclear@0
|
96
|
nuclear@0
|
97 InitRadialBitmapCopy();
|
nuclear@0
|
98
|
nuclear@0
|
99 unsigned short *avram;
|
nuclear@0
|
100
|
nuclear@0
|
101 // 1o tetarthmorio
|
nuclear@0
|
102
|
nuclear@0
|
103 avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci;
|
nuclear@0
|
104
|
nuclear@0
|
105 i=(ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci;
|
nuclear@0
|
106 ri=0;
|
nuclear@0
|
107 for (int y=ScreenHeight/2-1+dcy; y>=0; y--)
|
nuclear@0
|
108 {
|
nuclear@0
|
109 for (int x=ScreenWidth/2-1+dcx; x>=0; x--)
|
nuclear@0
|
110 {
|
nuclear@0
|
111
|
nuclear@0
|
112 rbuffer[i] = (rbuffer[i] + rbuffer[i - radir0[ri]] + rbuffer[i - radir1[ri]] + rbuffer[i - radir2[ri]])>>2;
|
nuclear@0
|
113 gbuffer[i] = (gbuffer[i] + gbuffer[i - radir0[ri]] + gbuffer[i - radir1[ri]] + gbuffer[i - radir2[ri]])>>2;
|
nuclear@0
|
114 bbuffer[i] = (bbuffer[i] + bbuffer[i - radir0[ri]] + bbuffer[i - radir1[ri]] + bbuffer[i - radir2[ri]])>>2;
|
nuclear@0
|
115 *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
|
nuclear@0
|
116 i--;
|
nuclear@0
|
117 ri++;
|
nuclear@0
|
118 }
|
nuclear@0
|
119 i=i-ScreenWidth/2+dcx;
|
nuclear@0
|
120 ri+=ScreenWidth/2-dcx;
|
nuclear@0
|
121 avram=avram-ScreenWidth/2+dcx;
|
nuclear@0
|
122 }
|
nuclear@0
|
123
|
nuclear@0
|
124
|
nuclear@0
|
125 // 2 tetarthmorio
|
nuclear@0
|
126
|
nuclear@0
|
127 avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci;
|
nuclear@0
|
128
|
nuclear@0
|
129 i=ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci;
|
nuclear@0
|
130 ri=0;
|
nuclear@0
|
131 for (int y=ScreenHeight/2-1+dcy; y>=0; y--)
|
nuclear@0
|
132 {
|
nuclear@0
|
133 for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++)
|
nuclear@0
|
134 {
|
nuclear@0
|
135 rbuffer[i] = (rbuffer[i] + rbuffer[i + radir3[ri]] + rbuffer[i + radir4[ri]] + rbuffer[i + radir5[ri]])>>2;
|
nuclear@0
|
136 gbuffer[i] = (gbuffer[i] + gbuffer[i + radir3[ri]] + gbuffer[i + radir4[ri]] + gbuffer[i + radir5[ri]])>>2;
|
nuclear@0
|
137 bbuffer[i] = (bbuffer[i] + bbuffer[i + radir3[ri]] + bbuffer[i + radir4[ri]] + bbuffer[i + radir5[ri]])>>2;
|
nuclear@0
|
138 *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
|
nuclear@0
|
139 i++;
|
nuclear@0
|
140 ri++;
|
nuclear@0
|
141 }
|
nuclear@0
|
142 i=i-3*(ScreenWidth/2)+dcx;
|
nuclear@0
|
143 ri+=ScreenWidth/2+dcx;
|
nuclear@0
|
144 avram=avram-3*(ScreenWidth/2)+dcx;
|
nuclear@0
|
145 }
|
nuclear@0
|
146
|
nuclear@0
|
147
|
nuclear@0
|
148 // 3 tetarthmorio
|
nuclear@0
|
149
|
nuclear@0
|
150 avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci;
|
nuclear@0
|
151
|
nuclear@0
|
152 i=ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci;
|
nuclear@0
|
153 ri=0;
|
nuclear@0
|
154 for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++)
|
nuclear@0
|
155 {
|
nuclear@0
|
156 for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++)
|
nuclear@0
|
157 {
|
nuclear@0
|
158 rbuffer[i] = (rbuffer[i] + rbuffer[i + radir0[ri]] + rbuffer[i + radir1[ri]] + rbuffer[i + radir2[ri]])>>2;
|
nuclear@0
|
159 gbuffer[i] = (gbuffer[i] + gbuffer[i + radir0[ri]] + gbuffer[i + radir1[ri]] + gbuffer[i + radir2[ri]])>>2;
|
nuclear@0
|
160 bbuffer[i] = (bbuffer[i] + bbuffer[i + radir0[ri]] + bbuffer[i + radir1[ri]] + bbuffer[i + radir2[ri]])>>2;
|
nuclear@0
|
161 *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
|
nuclear@0
|
162 i++;
|
nuclear@0
|
163 ri++;
|
nuclear@0
|
164 }
|
nuclear@0
|
165 i+=ScreenWidth/2+dcx;
|
nuclear@0
|
166 ri+=ScreenWidth/2+dcx;
|
nuclear@0
|
167 avram+=ScreenWidth/2+dcx;
|
nuclear@0
|
168 }
|
nuclear@0
|
169
|
nuclear@0
|
170
|
nuclear@0
|
171
|
nuclear@0
|
172 // 4o tetarthmorio
|
nuclear@0
|
173
|
nuclear@0
|
174 avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci;
|
nuclear@0
|
175
|
nuclear@0
|
176 i=(ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci;
|
nuclear@0
|
177 ri=0;
|
nuclear@0
|
178 for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++)
|
nuclear@0
|
179 {
|
nuclear@0
|
180 for (int x=ScreenWidth/2-1+dcx; x>=0; x--)
|
nuclear@0
|
181 {
|
nuclear@0
|
182 rbuffer[i] = (rbuffer[i] + rbuffer[i - radir3[ri]] + rbuffer[i - radir4[ri]] + rbuffer[i - radir5[ri]])>>2;
|
nuclear@0
|
183 gbuffer[i] = (gbuffer[i] + gbuffer[i - radir3[ri]] + gbuffer[i - radir4[ri]] + gbuffer[i - radir5[ri]])>>2;
|
nuclear@0
|
184 bbuffer[i] = (bbuffer[i] + bbuffer[i - radir3[ri]] + bbuffer[i - radir4[ri]] + bbuffer[i - radir5[ri]])>>2;
|
nuclear@0
|
185 *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3);
|
nuclear@0
|
186 i--;
|
nuclear@0
|
187 ri++;
|
nuclear@0
|
188 }
|
nuclear@0
|
189 i+=3*(ScreenWidth/2)+dcx;
|
nuclear@0
|
190 ri+=ScreenWidth/2-dcx;
|
nuclear@0
|
191 avram+=3*(ScreenWidth/2)+dcx;
|
nuclear@0
|
192 }
|
nuclear@0
|
193 }
|
nuclear@0
|
194
|
nuclear@0
|
195 void RunRadialblur(int ntime, unsigned short *vram)
|
nuclear@0
|
196 {
|
nuclear@0
|
197 Radial(ntime, vram);
|
nuclear@0
|
198 }
|