gpmark
diff src/radialblur.cpp @ 0:5019d031b485
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Wed, 05 Jun 2013 22:33:37 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/radialblur.cpp Wed Jun 05 22:33:37 2013 +0300 1.3 @@ -0,0 +1,198 @@ 1.4 +#include <math.h> 1.5 + 1.6 +#include "main.h" 1.7 +#include "sky1.h" 1.8 + 1.9 +unsigned char rbmp[ScreenSize]; 1.10 +unsigned char gbmp[ScreenSize]; 1.11 +unsigned char bbmp[ScreenSize]; 1.12 + 1.13 +unsigned char rbuffer[ScreenSize]; 1.14 +unsigned char gbuffer[ScreenSize]; 1.15 +unsigned char bbuffer[ScreenSize]; 1.16 + 1.17 +short radir0[ScreenSize]; 1.18 +short radir1[ScreenSize]; 1.19 +short radir2[ScreenSize]; 1.20 + 1.21 +short radir3[ScreenSize]; 1.22 +short radir4[ScreenSize]; 1.23 +short radir5[ScreenSize]; 1.24 + 1.25 +void InitRadialBitmap1() 1.26 +{ 1.27 + int x, y, i = 0; 1.28 + unsigned short c; 1.29 + for (y=0; y<ScreenHeight; y++) 1.30 + { 1.31 + for (x=0; x<ScreenWidth; x ++) 1.32 + { 1.33 + c = sky1[(x&255) + (((ScreenHeight-1)-y)<<8)]; 1.34 + rbmp[i] = ((c>>11) & 31) << 3; 1.35 + gbmp[i] = ((c>>5) & 63) << 2; 1.36 + bbmp[i] = (c & 31) << 3; 1.37 + i++; 1.38 + } 1.39 + } 1.40 +} 1.41 + 1.42 +void InitRadialblur() 1.43 +{ 1.44 + InitRadialBitmap1(); 1.45 + 1.46 + float rb_shortness = 4.0f; 1.47 + 1.48 + int xi, yi; 1.49 + int i=0; 1.50 + int x, y; 1.51 + for (y=0; y<ScreenHeight; y++) 1.52 + { 1.53 + for (x=0; x<ScreenWidth; x++) 1.54 + { 1.55 + xi = (int)(-(x/rb_shortness)); 1.56 + yi = (int)(-(y/rb_shortness)); 1.57 + radir0[i] = (xi>>1) + (yi>>1)*ScreenWidth; 1.58 + radir1[i] = (xi>>2) + (yi>>2)*ScreenWidth; 1.59 + radir2[i] = (xi>>3) + (yi>>3)*ScreenWidth; 1.60 + i++; 1.61 + } 1.62 + } 1.63 + 1.64 + i=0; 1.65 + for (y=0; y<ScreenHeight; y++) 1.66 + { 1.67 + for (x=0; x<ScreenWidth; x++) 1.68 + { 1.69 + xi = (int)(-(x/rb_shortness)); 1.70 + yi = (int)(y/rb_shortness); 1.71 + radir3[i] = (xi>>1) + (yi>>1)*ScreenWidth; 1.72 + radir4[i] = (xi>>2) + (yi>>2)*ScreenWidth; 1.73 + radir5[i] = (xi>>3) + (yi>>3)*ScreenWidth; 1.74 + i++; 1.75 + } 1.76 + } 1.77 +} 1.78 + 1.79 + 1.80 +void InitRadialBitmapCopy() 1.81 +{ 1.82 + int i; 1.83 + unsigned int *rbuffer32 = (unsigned int*)rbuffer, *gbuffer32 = (unsigned int*)gbuffer, *bbuffer32 = (unsigned int*)bbuffer; 1.84 + for (i=0; i<ScreenSize; i+=4) 1.85 + { 1.86 + *rbuffer32++ = rbmp[i] | (rbmp[i+1]<<8) | (rbmp[i+2]<<16) | (rbmp[i+3]<<24); 1.87 + *gbuffer32++ = gbmp[i] | (gbmp[i+1]<<8) | (gbmp[i+2]<<16) | (gbmp[i+3]<<24); 1.88 + *bbuffer32++ = bbmp[i] | (bbmp[i+1]<<8) | (bbmp[i+2]<<16) | (bbmp[i+3]<<24); 1.89 + } 1.90 +} 1.91 + 1.92 +void Radial(int ntime, unsigned short *vram) 1.93 +{ 1.94 + int i,ri; 1.95 + 1.96 + int dcx = (int)(sin((float)ntime/23.0f)*(ScreenWidth>>1)); 1.97 + int dcy = (int)(sin((float)ntime/32.0f)*(ScreenHeight>>1)); 1.98 + int dci = dcx + dcy*ScreenWidth; 1.99 + 1.100 + InitRadialBitmapCopy(); 1.101 + 1.102 + unsigned short *avram; 1.103 + 1.104 +// 1o tetarthmorio 1.105 + 1.106 + avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci; 1.107 + 1.108 + i=(ScreenWidth/2-1) + (ScreenHeight/2-1)*ScreenWidth + dci; 1.109 + ri=0; 1.110 + for (int y=ScreenHeight/2-1+dcy; y>=0; y--) 1.111 + { 1.112 + for (int x=ScreenWidth/2-1+dcx; x>=0; x--) 1.113 + { 1.114 + 1.115 + rbuffer[i] = (rbuffer[i] + rbuffer[i - radir0[ri]] + rbuffer[i - radir1[ri]] + rbuffer[i - radir2[ri]])>>2; 1.116 + gbuffer[i] = (gbuffer[i] + gbuffer[i - radir0[ri]] + gbuffer[i - radir1[ri]] + gbuffer[i - radir2[ri]])>>2; 1.117 + bbuffer[i] = (bbuffer[i] + bbuffer[i - radir0[ri]] + bbuffer[i - radir1[ri]] + bbuffer[i - radir2[ri]])>>2; 1.118 + *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3); 1.119 + i--; 1.120 + ri++; 1.121 + } 1.122 + i=i-ScreenWidth/2+dcx; 1.123 + ri+=ScreenWidth/2-dcx; 1.124 + avram=avram-ScreenWidth/2+dcx; 1.125 + } 1.126 + 1.127 + 1.128 +// 2 tetarthmorio 1.129 + 1.130 + avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci; 1.131 + 1.132 + i=ScreenWidth/2 + (ScreenHeight/2-1)*ScreenWidth + dci; 1.133 + ri=0; 1.134 + for (int y=ScreenHeight/2-1+dcy; y>=0; y--) 1.135 + { 1.136 + for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++) 1.137 + { 1.138 + rbuffer[i] = (rbuffer[i] + rbuffer[i + radir3[ri]] + rbuffer[i + radir4[ri]] + rbuffer[i + radir5[ri]])>>2; 1.139 + gbuffer[i] = (gbuffer[i] + gbuffer[i + radir3[ri]] + gbuffer[i + radir4[ri]] + gbuffer[i + radir5[ri]])>>2; 1.140 + bbuffer[i] = (bbuffer[i] + bbuffer[i + radir3[ri]] + bbuffer[i + radir4[ri]] + bbuffer[i + radir5[ri]])>>2; 1.141 + *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3); 1.142 + i++; 1.143 + ri++; 1.144 + } 1.145 + i=i-3*(ScreenWidth/2)+dcx; 1.146 + ri+=ScreenWidth/2+dcx; 1.147 + avram=avram-3*(ScreenWidth/2)+dcx; 1.148 + } 1.149 + 1.150 + 1.151 +// 3 tetarthmorio 1.152 + 1.153 + avram=(unsigned short*)vram + ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci; 1.154 + 1.155 + i=ScreenWidth/2 + (ScreenHeight/2)*ScreenWidth + dci; 1.156 + ri=0; 1.157 + for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++) 1.158 + { 1.159 + for (int x=ScreenWidth/2+dcx; x<ScreenWidth; x++) 1.160 + { 1.161 + rbuffer[i] = (rbuffer[i] + rbuffer[i + radir0[ri]] + rbuffer[i + radir1[ri]] + rbuffer[i + radir2[ri]])>>2; 1.162 + gbuffer[i] = (gbuffer[i] + gbuffer[i + radir0[ri]] + gbuffer[i + radir1[ri]] + gbuffer[i + radir2[ri]])>>2; 1.163 + bbuffer[i] = (bbuffer[i] + bbuffer[i + radir0[ri]] + bbuffer[i + radir1[ri]] + bbuffer[i + radir2[ri]])>>2; 1.164 + *avram++ = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3); 1.165 + i++; 1.166 + ri++; 1.167 + } 1.168 + i+=ScreenWidth/2+dcx; 1.169 + ri+=ScreenWidth/2+dcx; 1.170 + avram+=ScreenWidth/2+dcx; 1.171 + } 1.172 + 1.173 + 1.174 + 1.175 +// 4o tetarthmorio 1.176 + 1.177 + avram=(unsigned short*)vram + (ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci; 1.178 + 1.179 + i=(ScreenWidth/2-1) + (ScreenHeight/2)*ScreenWidth + dci; 1.180 + ri=0; 1.181 + for (int y=ScreenHeight/2+dcy; y<ScreenHeight; y++) 1.182 + { 1.183 + for (int x=ScreenWidth/2-1+dcx; x>=0; x--) 1.184 + { 1.185 + rbuffer[i] = (rbuffer[i] + rbuffer[i - radir3[ri]] + rbuffer[i - radir4[ri]] + rbuffer[i - radir5[ri]])>>2; 1.186 + gbuffer[i] = (gbuffer[i] + gbuffer[i - radir3[ri]] + gbuffer[i - radir4[ri]] + gbuffer[i - radir5[ri]])>>2; 1.187 + bbuffer[i] = (bbuffer[i] + bbuffer[i - radir3[ri]] + bbuffer[i - radir4[ri]] + bbuffer[i - radir5[ri]])>>2; 1.188 + *avram-- = ((rbuffer[i]>>3)<<11) | ((gbuffer[i]>>2)<<5) | (bbuffer[i]>>3); 1.189 + i--; 1.190 + ri++; 1.191 + } 1.192 + i+=3*(ScreenWidth/2)+dcx; 1.193 + ri+=ScreenWidth/2-dcx; 1.194 + avram+=3*(ScreenWidth/2)+dcx; 1.195 + } 1.196 +} 1.197 + 1.198 +void RunRadialblur(int ntime, unsigned short *vram) 1.199 +{ 1.200 + Radial(ntime, vram); 1.201 +}