annotate TaskManager/Test/test_render/sys.cpp @ 206:f5784443dd50 draft

add Camera
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Thu, 29 Jan 2009 13:52:47 +0900
parents be90197f90d4
children c020ccff4627
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
160
gongo@localhost.localdomain
parents: 109
diff changeset
1 #include <stdlib.h>
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
2 #include <iostream>
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
3 #include <math.h>
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
4 #include "sys.h"
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
5 using namespace std;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
6
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
7 void noMoreMemory()
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
8 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
9 cout << "can't allocate memory\n";
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
10 exit(1);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
11 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
12
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
13 void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16]
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
14 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
15 for(int t=0; t<16; t+=4)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
16 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
17 for(int i=0; i<4; i++)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
18 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
19 xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
20 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
21 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
22 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
23
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
24 void get_matrix( float *matrix, float *rxyz, float *txyz, float *stack)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
25 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
26 float radx,rady,radz;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
27 radx = rxyz[0]*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
28 rady = rxyz[1]*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
29 radz = rxyz[2]*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
30
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
31 float sinx = sin(radx);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
32 float cosx = cos(radx);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
33 float siny = sin(rady);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
34 float cosy = cos(rady);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
35 float sinz = sin(radz);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
36 float cosz = cos(radz);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
37
206
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
38 /* View Transform */
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
39 matrix[0] = cosz*cosy+sinz*sinx*siny;
174
2c7d9057dd5d getScale()、getTapestry から、span->length に適切なテクスチャの選択に成功
gongo@localhost.localdomain
parents: 160
diff changeset
40 matrix[1] = sinz*cosx;
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
41 matrix[2] = -cosz*siny+sinz*sinx*cosy;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
42 matrix[3] = 0;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
43 matrix[4] = -sinz*cosy+cosz*sinx*siny;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
44 matrix[5] = cosz*cosx;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
45 matrix[6] = sinz*siny+cosz*sinx*cosy;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
46 matrix[7] = 0;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
47 matrix[8] = cosx*siny;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
48 matrix[9] = -sinx;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
49 matrix[10] = cosx*cosy;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
50 matrix[11] = 0;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
51 matrix[12] = txyz[0];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
52 matrix[13] = txyz[1];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
53 matrix[14] = txyz[2];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
54 matrix[15] = 1;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
55
206
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
56 /* Perspective Transform */
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
57 #if 0
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
58 float n = 0.0f;
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
59 float f = 1000.0f;
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
60 float a = 0.995f / (n-f);
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
61 float b = 1-((0.995*n)/(n-f));
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
62
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
63 matrix[0] *= a*txyz[2]+b;
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
64 matrix[5] *= a*txyz[2]+b;
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
65 #endif
f5784443dd50 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
66
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
67 float m[16];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
68
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
69 for(int i=0; i<16; i++)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
70 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
71 m[i] = matrix[i];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
72 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
73
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
74 if(stack)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
75 {
176
gongo@localhost.localdomain
parents: 174
diff changeset
76 matrix4x4(matrix, m, stack);
109
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
77 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
78
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
79 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
80
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
81 void rotate_x(float *xyz, float r)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
82 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
83 float rad = r*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
84
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
85 xyz[0] = xyz[0];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
86 xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
87 xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
88 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
89
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
90 void rotate_y(float *xyz, float r)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
91 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
92 float rad = r*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
93
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
94 xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
95 xyz[1] = xyz[1];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
96 xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
97 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
98
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
99 void rotate_z(float *xyz, float r)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
100 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
101 float rad = r*3.14/180;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
102
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
103 xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
104 xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
105 xyz[2] = xyz[2];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
106 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
107
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
108 void rotate(float *xyz, float *matrix)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
109 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
110 float abc[4];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
111 abc[0] = xyz[0];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
112 abc[1] = xyz[1];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
113 abc[2] = xyz[2];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
114 abc[3] = xyz[3];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
115
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
116 for(int i=0; i<4; i++)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
117 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
118 //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
119 xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
120 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
121 }
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
122
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
123
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
124 void translate(float *xyz, float x, float y, float z)
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
125 {
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
126 xyz[0] += x;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
127 xyz[1] += y;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
128 xyz[2] += z;
028ffc9c0375 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
129 }