gpmark

annotate src/rotozoomer.cpp @ 0:5019d031b485

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 05 Jun 2013 22:33:37 +0300
parents
children
rev   line source
nuclear@0 1 #include <math.h>
nuclear@0 2 #include <stdio.h>
nuclear@0 3 #include "main.h"
nuclear@0 4
nuclear@0 5 unsigned short draculin[128 * 128];
nuclear@0 6
nuclear@0 7 void InitRotozoomer()
nuclear@0 8 {
nuclear@0 9 unsigned short dracol[256];
nuclear@0 10
nuclear@0 11 FILE *dracdata;
nuclear@0 12 dracdata=fopen("draculf.bin","rb");
nuclear@0 13
nuclear@0 14 int x0=fgetc(dracdata);
nuclear@0 15 int y0=fgetc(dracdata);
nuclear@0 16
nuclear@0 17 int r,g,b;
nuclear@0 18 for (int i=0;i<256;i++)
nuclear@0 19 dracol[i]=(((fgetc(dracdata)>>1)<<11) | (fgetc(dracdata)<<5) | (fgetc(dracdata))>>1);
nuclear@0 20
nuclear@0 21 for (int y=0;y<y0;y++)
nuclear@0 22 for (int x=0;x<x0;x++)
nuclear@0 23 draculin[(y<<7) + x]=dracol[fgetc(dracdata)];
nuclear@0 24
nuclear@0 25 fclose(dracdata);
nuclear@0 26 }
nuclear@0 27
nuclear@0 28 void RunRotozoomer(float rot, float zoom, unsigned short *vram)
nuclear@0 29 {
nuclear@0 30 int fp = 16;
nuclear@0 31
nuclear@0 32 int mx = 0, my = 0, mmx = 50<<fp, mmy = 20<<fp;
nuclear@0 33 int dx = (int)((cos(rot/d2r)*zoom) * pow(2,fp));
nuclear@0 34 int dy = (int)((sin(rot/d2r)*zoom) * pow(2,fp));
nuclear@0 35
nuclear@0 36 int x,y;
nuclear@0 37 unsigned short c;
nuclear@0 38
nuclear@0 39 for (y=0; y<ScreenHeight; y++)
nuclear@0 40 {
nuclear@0 41 mmx = mmx - dy;
nuclear@0 42 mmy = mmy + dx;
nuclear@0 43 mx = mmx;
nuclear@0 44 my = mmy;
nuclear@0 45 for (x=0; x<ScreenWidth; x++)
nuclear@0 46 {
nuclear@0 47 mx = mx + dx;
nuclear@0 48 my = my + dy;
nuclear@0 49 c = draculin[((mx>>fp)&127) + (((my>>fp)&127) << 7)];
nuclear@0 50 *vram++=c;
nuclear@0 51 }
nuclear@0 52 }
nuclear@0 53 }
nuclear@0 54
nuclear@0 55 void RunRotozoomerNormal(int ntime, unsigned short *vram)
nuclear@0 56 {
nuclear@0 57 float rot = sin(ntime/478.0f) * 280.0f;
nuclear@0 58 float zoom = sin(ntime/227.0f)*0.75f + 0.76f;
nuclear@0 59
nuclear@0 60 RunRotozoomer(rot, zoom, vram);
nuclear@0 61 }
nuclear@0 62
nuclear@0 63 void RunRotozoomerNear(int ntime, unsigned short *vram)
nuclear@0 64 {
nuclear@0 65 float rot = sin(ntime/478.0f) * 280.0f;
nuclear@0 66 float zoom = 0.05f;
nuclear@0 67
nuclear@0 68 RunRotozoomer(rot, zoom, vram);
nuclear@0 69 }
nuclear@0 70
nuclear@0 71 void RunRotozoomerFar(int ntime, unsigned short *vram)
nuclear@0 72 {
nuclear@0 73 float rot = sin(ntime/478.0f) * 280.0f;
nuclear@0 74 float zoom = 8.0f;
nuclear@0 75
nuclear@0 76 RunRotozoomer(rot, zoom, vram);
nuclear@0 77 }