annotate TaskManager/Test/test_render/Camera.cpp @ 207:6b230b6a7ba2

add Camera.cpp
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Thu, 29 Jan 2009 13:53:04 +0900
parents
children fe2cc32cd94d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
1 #include <math.h>
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
2 #include "SceneGraphRoot.h"
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
3 #include "Camera.h"
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
4 #include "sys.h"
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
5
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
6 static void
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
7 camera_move(SceneGraphPtr _node, int screen_w, int screen_h)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
8 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
9 Pad *pad = sgroot->getController();
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
10 CameraPtr node = (CameraPtr)_node;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
11
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
12 if (pad->left.isPush() || pad->left.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
13 node->xyz[0] += 2.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
14 } else if (pad->right.isPush() || pad->right.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
15 node->xyz[0] -= 2.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
16 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
17
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
18 if (pad->up.isPush() || pad->up.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
19 node->xyz[1] += 2.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
20 } else if (pad->down.isPush() || pad->down.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
21 node->xyz[1] -= 2.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
22 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
23
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
24 if (pad->start.isPush() || pad->start.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
25 node->xyz[2] += 10.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
26 } else if (pad->select.isPush() || pad->select.isHold()) {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
27 node->xyz[2] -= 10.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
28 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
29 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
30
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
31 static void
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
32 camera_collision(SceneGraphPtr node, int screen_w, int screen_h,
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
33 SceneGraphPtr tree)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
34 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
35 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
36
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
37 Camera::Camera(void)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
38 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
39 name = (const char*)"Camera";
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
40
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
41 fov = 120.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
42 near = 0.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
43 far = 1000.0f;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
44
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
45 this->set_move_collision(camera_move, camera_collision);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
46 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
47
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
48 #if 0
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
49 void
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
50 Camera::updatePerspectiveMatrix(float *m, float z0, float z1)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
51 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
52 // scale = az + b;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
53 // z が near position(z0) => 縮小率 1
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
54 // z が far position(z1) => 縮小率 0.00053 (1920pixel が 1 pixel になる)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
55 // でPerspective変換を行う
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
56 float a = 0.99947f / (near - far);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
57 float b = 1-((0.99947f*near)/(near - far));
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
58
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
59 matrix[0] *= a*txyz[2]+b;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
60 matrix[5] *= a*txyz[2]+b;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
61
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
62 float a = -0.01;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
63 //float b = 1 + -a*z0;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
64 float b = 1.0;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
65
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
66 float z = a*z0 + b;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
67
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
68 m[0] = z;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
69 m[5] = z;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
70 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
71
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
72 #endif
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
73 void
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
74 Camera::updatePerspectiveMatrix(float *m, float s, float r)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
75 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
76 m[0] = s*r;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
77 m[5] = s;
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
78 }
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
79
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
80 void
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
81 Camera::update(int w, int h)
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
82 {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
83 float pers_matrix[16] = {
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
84 1, 0, 0, 0,
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
85 0, 1, 0, 0,
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
86 0, 0, 1, 0,
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
87 0, 0, 0, 0
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
88 };
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
89
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
90 float m[16];
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
91
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
92 float zoom = 1.0f / tan(fov*0.5f*M_PI/180.0f);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
93
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
94 //updatePerspectiveMatrix(pers_matrix, zoom, (float)h/(float)w);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
95 get_matrix(matrix, angle, xyz, NULL);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
96 //matrix4x4(matrix, m, pers_matrix);
6b230b6a7ba2 add Camera.cpp
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
diff changeset
97 }