annotate TaskManager/Test/test_render/sys.cpp @ 212:fe2cc32cd94d

fix
author gongo@localhost.localdomain
date Sat, 31 Jan 2009 08:54:22 +0900
parents dee3b5092a70
children 7ca6a2ef5be9
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
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
2 #include <iostream>
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
3 #include <math.h>
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
4 #include "sys.h"
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
5 using namespace std;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
6
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
7 void noMoreMemory()
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
8 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
9 cout << "can't allocate memory\n";
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
10 exit(1);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
11 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
12
212
gongo@localhost.localdomain
parents: 206
diff changeset
13 /**
gongo@localhost.localdomain
parents: 206
diff changeset
14 * ベクトルの正規化
gongo@localhost.localdomain
parents: 206
diff changeset
15 *
gongo@localhost.localdomain
parents: 206
diff changeset
16 * @param[out] v0 output vector
gongo@localhost.localdomain
parents: 206
diff changeset
17 * @param[in] v1 input vector
gongo@localhost.localdomain
parents: 206
diff changeset
18 */
gongo@localhost.localdomain
parents: 206
diff changeset
19 void
gongo@localhost.localdomain
parents: 206
diff changeset
20 normalize(float *v0, float *v1)
gongo@localhost.localdomain
parents: 206
diff changeset
21 {
gongo@localhost.localdomain
parents: 206
diff changeset
22 float norm, dnorm;
gongo@localhost.localdomain
parents: 206
diff changeset
23
gongo@localhost.localdomain
parents: 206
diff changeset
24 norm = sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]);
gongo@localhost.localdomain
parents: 206
diff changeset
25 if (norm > 0) {
gongo@localhost.localdomain
parents: 206
diff changeset
26 dnorm = 1.0/norm;
gongo@localhost.localdomain
parents: 206
diff changeset
27 v0[0] = v1[0]*dnorm;
gongo@localhost.localdomain
parents: 206
diff changeset
28 v0[1] = v1[1]*dnorm;
gongo@localhost.localdomain
parents: 206
diff changeset
29 v0[2] = v1[2]*dnorm;
gongo@localhost.localdomain
parents: 206
diff changeset
30 v0[3] = v1[3]*dnorm;
gongo@localhost.localdomain
parents: 206
diff changeset
31 }
gongo@localhost.localdomain
parents: 206
diff changeset
32 }
gongo@localhost.localdomain
parents: 206
diff changeset
33
gongo@localhost.localdomain
parents: 206
diff changeset
34 /**
gongo@localhost.localdomain
parents: 206
diff changeset
35 * ベクトルの減算 v0 = v1 - v2
gongo@localhost.localdomain
parents: 206
diff changeset
36 */
gongo@localhost.localdomain
parents: 206
diff changeset
37 void
gongo@localhost.localdomain
parents: 206
diff changeset
38 subVector(float *v0, float *v1, float *v2)
gongo@localhost.localdomain
parents: 206
diff changeset
39 {
gongo@localhost.localdomain
parents: 206
diff changeset
40 v0[0] = v1[0] - v2[0];
gongo@localhost.localdomain
parents: 206
diff changeset
41 v0[1] = v1[1] - v2[1];
gongo@localhost.localdomain
parents: 206
diff changeset
42 v0[2] = v1[2] - v2[2];
gongo@localhost.localdomain
parents: 206
diff changeset
43 v0[3] = v1[3] - v2[3];
gongo@localhost.localdomain
parents: 206
diff changeset
44 }
gongo@localhost.localdomain
parents: 206
diff changeset
45
gongo@localhost.localdomain
parents: 206
diff changeset
46 /**
gongo@localhost.localdomain
parents: 206
diff changeset
47 * ベクトルの外積 v0 = v1 x v2
gongo@localhost.localdomain
parents: 206
diff changeset
48 */
gongo@localhost.localdomain
parents: 206
diff changeset
49 void
gongo@localhost.localdomain
parents: 206
diff changeset
50 outerProduct(float *v0, float *v1, float *v2)
gongo@localhost.localdomain
parents: 206
diff changeset
51 {
gongo@localhost.localdomain
parents: 206
diff changeset
52 v0[0] = v1[1] * v2[2] - v1[2] * v2[1];
gongo@localhost.localdomain
parents: 206
diff changeset
53 v0[1] = v1[2] * v2[0] - v1[0] * v2[2];
gongo@localhost.localdomain
parents: 206
diff changeset
54 v0[2] = v1[0] * v2[1] - v1[1] * v2[0];
gongo@localhost.localdomain
parents: 206
diff changeset
55 v0[3] = 0;
gongo@localhost.localdomain
parents: 206
diff changeset
56 }
gongo@localhost.localdomain
parents: 206
diff changeset
57
gongo@localhost.localdomain
parents: 206
diff changeset
58 /**
gongo@localhost.localdomain
parents: 206
diff changeset
59 * ベクトルの内積 f = v0 * v1
gongo@localhost.localdomain
parents: 206
diff changeset
60 */
gongo@localhost.localdomain
parents: 206
diff changeset
61 float
gongo@localhost.localdomain
parents: 206
diff changeset
62 innerProduct(float *v0, float *v1)
gongo@localhost.localdomain
parents: 206
diff changeset
63 {
gongo@localhost.localdomain
parents: 206
diff changeset
64 return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
gongo@localhost.localdomain
parents: 206
diff changeset
65 }
gongo@localhost.localdomain
parents: 206
diff changeset
66
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
67 void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16]
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
68 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
69 for(int t=0; t<16; t+=4)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
70 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
71 for(int i=0; i<4; i++)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
72 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
73 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];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
74 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
75 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
76 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
77
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
78 void get_matrix( float *matrix, float *rxyz, float *txyz, float *stack)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
79 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
80 float radx,rady,radz;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
81 radx = rxyz[0]*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
82 rady = rxyz[1]*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
83 radz = rxyz[2]*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
84
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
85 float sinx = sin(radx);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
86 float cosx = cos(radx);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
87 float siny = sin(rady);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
88 float cosy = cos(rady);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
89 float sinz = sin(radz);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
90 float cosz = cos(radz);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
91
206
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
92 /* View Transform */
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
93 matrix[0] = cosz*cosy+sinz*sinx*siny;
174
559b48b69b76 getScale()、getTapestry から、span->length に適切なテクスチャの選択に成功
gongo@localhost.localdomain
parents: 160
diff changeset
94 matrix[1] = sinz*cosx;
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
95 matrix[2] = -cosz*siny+sinz*sinx*cosy;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
96 matrix[3] = 0;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
97 matrix[4] = -sinz*cosy+cosz*sinx*siny;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
98 matrix[5] = cosz*cosx;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
99 matrix[6] = sinz*siny+cosz*sinx*cosy;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
100 matrix[7] = 0;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
101 matrix[8] = cosx*siny;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
102 matrix[9] = -sinx;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
103 matrix[10] = cosx*cosy;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
104 matrix[11] = 0;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
105 matrix[12] = txyz[0];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
106 matrix[13] = txyz[1];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
107 matrix[14] = txyz[2];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
108 matrix[15] = 1;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
109
206
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
110 /* Perspective Transform */
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
111 #if 0
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
112 float n = 0.0f;
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
113 float f = 1000.0f;
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
114 float a = 0.995f / (n-f);
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
115 float b = 1-((0.995*n)/(n-f));
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
116
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
117 matrix[0] *= a*txyz[2]+b;
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
118 matrix[5] *= a*txyz[2]+b;
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
119 #endif
dee3b5092a70 add Camera
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 176
diff changeset
120
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
121 float m[16];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
122
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
123 for(int i=0; i<16; i++)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
124 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
125 m[i] = matrix[i];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
126 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
127
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
128 if(stack)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
129 {
176
gongo@localhost.localdomain
parents: 174
diff changeset
130 matrix4x4(matrix, m, stack);
109
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
131 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
132
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
133 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
134
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
135 void rotate_x(float *xyz, float r)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
136 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
137 float rad = r*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
138
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
139 xyz[0] = xyz[0];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
140 xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
141 xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
142 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
143
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
144 void rotate_y(float *xyz, float r)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
145 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
146 float rad = r*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
147
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
148 xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
149 xyz[1] = xyz[1];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
150 xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
151 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
152
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
153 void rotate_z(float *xyz, float r)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
154 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
155 float rad = r*3.14/180;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
156
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
157 xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
158 xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
159 xyz[2] = xyz[2];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
160 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
161
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
162 void rotate(float *xyz, float *matrix)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
163 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
164 float abc[4];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
165 abc[0] = xyz[0];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
166 abc[1] = xyz[1];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
167 abc[2] = xyz[2];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
168 abc[3] = xyz[3];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
169
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
170 for(int i=0; i<4; i++)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
171 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
172 //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
173 xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
174 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
175 }
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
176
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
177
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
178 void translate(float *xyz, float x, float y, float z)
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
179 {
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
180 xyz[0] += x;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
181 xyz[1] += y;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
182 xyz[2] += z;
5c194c71eca8 Cerium cvs version
gongo@gendarme.local
parents:
diff changeset
183 }