A demo program for DOGL-128 LCD module. Based on Mike Sheldon's 3D Tie Fighter demo.

Dependencies:   mbed

Committer:
igorsk
Date:
Thu Jan 14 00:49:39 2010 +0000
Revision:
0:2a5dccfd318f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:2a5dccfd318f 1 /*
igorsk 0:2a5dccfd318f 2 * libmbed-graphics 2D and wireframe 3D graphics library for the MBED
igorsk 0:2a5dccfd318f 3 * microcontroller platform
igorsk 0:2a5dccfd318f 4 * Copyright (C) <2009> Michael Sheldon <mike@mikeasoft.com>
igorsk 0:2a5dccfd318f 5 *
igorsk 0:2a5dccfd318f 6 * This library is free software; you can redistribute it and/or
igorsk 0:2a5dccfd318f 7 * modify it under the terms of the GNU Library General Public
igorsk 0:2a5dccfd318f 8 * License as published by the Free Software Foundation; either
igorsk 0:2a5dccfd318f 9 * version 2 of the License, or (at your option) any later version.
igorsk 0:2a5dccfd318f 10 *
igorsk 0:2a5dccfd318f 11 * This library is distributed in the hope that it will be useful,
igorsk 0:2a5dccfd318f 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
igorsk 0:2a5dccfd318f 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
igorsk 0:2a5dccfd318f 14 * Library General Public License for more details.
igorsk 0:2a5dccfd318f 15 *
igorsk 0:2a5dccfd318f 16 * You should have received a copy of the GNU Library General Public
igorsk 0:2a5dccfd318f 17 * License along with this library; if not, write to the
igorsk 0:2a5dccfd318f 18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
igorsk 0:2a5dccfd318f 19 * Boston, MA 02111-1307, USA.
igorsk 0:2a5dccfd318f 20 */
igorsk 0:2a5dccfd318f 21
igorsk 0:2a5dccfd318f 22 #include "Object3D.h"
igorsk 0:2a5dccfd318f 23
igorsk 0:2a5dccfd318f 24 Object3D::Object3D() {
igorsk 0:2a5dccfd318f 25 _x = 0;
igorsk 0:2a5dccfd318f 26 _y = 0;
igorsk 0:2a5dccfd318f 27 _z = 0;
igorsk 0:2a5dccfd318f 28 _rx = 0;
igorsk 0:2a5dccfd318f 29 _ry = 0;
igorsk 0:2a5dccfd318f 30 _rz = 0;
igorsk 0:2a5dccfd318f 31 _sx = 1;
igorsk 0:2a5dccfd318f 32 _sy = 1;
igorsk 0:2a5dccfd318f 33 _sz = 1;
igorsk 0:2a5dccfd318f 34 _colour = 0xffffff;
igorsk 0:2a5dccfd318f 35 }
igorsk 0:2a5dccfd318f 36
igorsk 0:2a5dccfd318f 37 void Object3D::position(int x, int y, int z) {
igorsk 0:2a5dccfd318f 38 _x = x;
igorsk 0:2a5dccfd318f 39 _y = y;
igorsk 0:2a5dccfd318f 40 _z = z;
igorsk 0:2a5dccfd318f 41 }
igorsk 0:2a5dccfd318f 42
igorsk 0:2a5dccfd318f 43 void Object3D::rotate(float rx, float ry, float rz) {
igorsk 0:2a5dccfd318f 44 _rx = rx;
igorsk 0:2a5dccfd318f 45 _ry = ry;
igorsk 0:2a5dccfd318f 46 _rz = rz;
igorsk 0:2a5dccfd318f 47 }
igorsk 0:2a5dccfd318f 48
igorsk 0:2a5dccfd318f 49 void Object3D::scale(float sx, float sy, float sz) {
igorsk 0:2a5dccfd318f 50 _sx = sx;
igorsk 0:2a5dccfd318f 51 _sy = sy;
igorsk 0:2a5dccfd318f 52 _sz = sz;
igorsk 0:2a5dccfd318f 53 }
igorsk 0:2a5dccfd318f 54
igorsk 0:2a5dccfd318f 55 void Object3D::colour(int colour) {
igorsk 0:2a5dccfd318f 56 _colour = colour;
igorsk 0:2a5dccfd318f 57 }
igorsk 0:2a5dccfd318f 58
igorsk 0:2a5dccfd318f 59 #define FASTSINCOS
igorsk 0:2a5dccfd318f 60
igorsk 0:2a5dccfd318f 61 #ifdef FASTSINCOS
igorsk 0:2a5dccfd318f 62
igorsk 0:2a5dccfd318f 63 // http://www.dspguru.com/dsp/tricks/parabolic-approximation-of-sin-and-cos
igorsk 0:2a5dccfd318f 64
igorsk 0:2a5dccfd318f 65 #define M_PI 3.14159265358979323846
igorsk 0:2a5dccfd318f 66 #define M_PI_2 1.57079632679489661923
igorsk 0:2a5dccfd318f 67 #define M_PI_4 0.785398163397448309616
igorsk 0:2a5dccfd318f 68 #define M_C 0.71256755058
igorsk 0:2a5dccfd318f 69
igorsk 0:2a5dccfd318f 70 void sincosf(float angle, float *sinx, float *cosx)
igorsk 0:2a5dccfd318f 71 {
igorsk 0:2a5dccfd318f 72 int quarter = int(floor(angle/M_PI_2));
igorsk 0:2a5dccfd318f 73
igorsk 0:2a5dccfd318f 74 float modphase = angle - quarter*M_PI_2;
igorsk 0:2a5dccfd318f 75 if ( modphase < 0 )
igorsk 0:2a5dccfd318f 76 modphase += M_PI_2;
igorsk 0:2a5dccfd318f 77
igorsk 0:2a5dccfd318f 78 quarter %= 4;
igorsk 0:2a5dccfd318f 79 if ( quarter < 0 )
igorsk 0:2a5dccfd318f 80 quarter += 4;
igorsk 0:2a5dccfd318f 81
igorsk 0:2a5dccfd318f 82 modphase = modphase/M_PI_2;
igorsk 0:2a5dccfd318f 83
igorsk 0:2a5dccfd318f 84 //printf("Angle: %f, q: %d, mod: %f\n", angle, quarter, modphase);
igorsk 0:2a5dccfd318f 85 float x, temp;
igorsk 0:2a5dccfd318f 86 switch (quarter)
igorsk 0:2a5dccfd318f 87 {
igorsk 0:2a5dccfd318f 88 case 0:
igorsk 0:2a5dccfd318f 89 // First quarter, angle = 0 .. pi/2
igorsk 0:2a5dccfd318f 90 x = modphase - 0.5f; // 1 sub
igorsk 0:2a5dccfd318f 91 temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add
igorsk 0:2a5dccfd318f 92 *sinx = temp + x; // 1 add
igorsk 0:2a5dccfd318f 93 *cosx = temp - x; // 1 sub
igorsk 0:2a5dccfd318f 94 break;
igorsk 0:2a5dccfd318f 95 case 1:
igorsk 0:2a5dccfd318f 96 // Second quarter, angle = pi/2 .. pi
igorsk 0:2a5dccfd318f 97 x = 0.5f - modphase; // 1 sub
igorsk 0:2a5dccfd318f 98 temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add
igorsk 0:2a5dccfd318f 99 *sinx = x + temp; // 1 add
igorsk 0:2a5dccfd318f 100 *cosx = x - temp; // 1 sub
igorsk 0:2a5dccfd318f 101 break;
igorsk 0:2a5dccfd318f 102 case 2:
igorsk 0:2a5dccfd318f 103 // Third quarter, angle = pi .. 1.5pi
igorsk 0:2a5dccfd318f 104 x = modphase - 0.5f; // 1 sub
igorsk 0:2a5dccfd318f 105 temp = (4*M_C - 2)*x*x - M_C; // 2 mul, 1 sub
igorsk 0:2a5dccfd318f 106 *sinx = temp - x; // 1 sub
igorsk 0:2a5dccfd318f 107 *cosx = temp + x; // 1 add
igorsk 0:2a5dccfd318f 108 break;
igorsk 0:2a5dccfd318f 109 case 3:
igorsk 0:2a5dccfd318f 110 // Fourth quarter, angle = 1.5pi..2pi
igorsk 0:2a5dccfd318f 111 x = modphase - 0.5f; // 1 sub
igorsk 0:2a5dccfd318f 112 temp = (2 - 4*M_C)*x*x + M_C; // 2 mul, 1 add
igorsk 0:2a5dccfd318f 113 *sinx = x - temp; // 1 sub
igorsk 0:2a5dccfd318f 114 *cosx = x + temp; // 1 add
igorsk 0:2a5dccfd318f 115 break;
igorsk 0:2a5dccfd318f 116 }
igorsk 0:2a5dccfd318f 117 }
igorsk 0:2a5dccfd318f 118
igorsk 0:2a5dccfd318f 119 #else // FASTSINCOS
igorsk 0:2a5dccfd318f 120
igorsk 0:2a5dccfd318f 121 void sincosf(float angle, float *sinx, float *cosx)
igorsk 0:2a5dccfd318f 122 {
igorsk 0:2a5dccfd318f 123 *sinx = sin(angle);
igorsk 0:2a5dccfd318f 124 *cosx = cos(angle);
igorsk 0:2a5dccfd318f 125 }
igorsk 0:2a5dccfd318f 126
igorsk 0:2a5dccfd318f 127 #endif // FASTSINCOS
igorsk 0:2a5dccfd318f 128
igorsk 0:2a5dccfd318f 129
igorsk 0:2a5dccfd318f 130 void rotate3d(int *x, int *y, int *z, float anglex, float angley, float anglez, int count)
igorsk 0:2a5dccfd318f 131 {
igorsk 0:2a5dccfd318f 132 float sinx, cosx, siny, cosy, sinz, cosz;
igorsk 0:2a5dccfd318f 133 sincosf(anglex, &sinx, &cosx);
igorsk 0:2a5dccfd318f 134 sincosf(angley, &siny, &cosy);
igorsk 0:2a5dccfd318f 135 sincosf(anglez, &sinz, &cosz);
igorsk 0:2a5dccfd318f 136
igorsk 0:2a5dccfd318f 137 for ( int i=0; i < count; i++)
igorsk 0:2a5dccfd318f 138 {
igorsk 0:2a5dccfd318f 139 int x1 = x[i];
igorsk 0:2a5dccfd318f 140 int y1 = y[i];
igorsk 0:2a5dccfd318f 141 int z1 = z[i];
igorsk 0:2a5dccfd318f 142
igorsk 0:2a5dccfd318f 143 int y2 = cosx * y1 - sinx * z1;
igorsk 0:2a5dccfd318f 144 int z2 = sinx * y1 + cosx * z1;
igorsk 0:2a5dccfd318f 145
igorsk 0:2a5dccfd318f 146 int x2 = cosy * x1 + siny * z2;
igorsk 0:2a5dccfd318f 147 int z3 = -siny * x1 + cosy * z2;
igorsk 0:2a5dccfd318f 148
igorsk 0:2a5dccfd318f 149 int x3 = cosz * x2 - sinz * y2;
igorsk 0:2a5dccfd318f 150 int y3 = sinz * x2 + cosz * y2;
igorsk 0:2a5dccfd318f 151
igorsk 0:2a5dccfd318f 152 x[i] = x3;
igorsk 0:2a5dccfd318f 153 y[i] = y3;
igorsk 0:2a5dccfd318f 154 z[i] = z3;
igorsk 0:2a5dccfd318f 155 }
igorsk 0:2a5dccfd318f 156 }