1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: SmTouchPanelCamera.cpp
4
5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Revision: 1 $
14 *---------------------------------------------------------------------------*/
15
16 #include <nn/os.h>
17
18 #include <nw/types.h>
19 #include <nw/ut.h>
20
21 #include "../include/SmTouchPanelCamera.h"
22 #include "../include/SmTouchPanelStatus.h"
23
24 namespace
25 {
26
27
28 //----------------------------------------
29 // コンストラクタ
SmTouchPanelCamera(SmCamera * smcamera)30 SmTouchPanelCamera::SmTouchPanelCamera( SmCamera* smcamera )
31 : SmMessage( NULL ),
32 m_SmCamera( smcamera ),
33 m_IsGrab( false ),
34 m_TouchPanelPosLastX( 0 ),
35 m_TouchPanelPosLastY( 0 ),
36 m_TouchPanelPosX( 0 ),
37 m_TouchPanelPosY( 0 ),
38 m_DegX( 0.f ),
39 m_DegY( 0.f )
40 {
41 // カメラ視点
42 m_SmCamera->GetPosition( &m_CameraPos );
43
44 // カメラ注視点
45 m_SmCamera->GetTarget( &m_CameraTarget );
46
47 // カメラ向き基準
48 m_CameraToward.x = m_CameraTarget.x - m_CameraPos.x;
49 m_CameraToward.y = m_CameraTarget.y - m_CameraPos.y;
50 m_CameraToward.z = m_CameraTarget.z - m_CameraPos.z;
51 m_CameraToward.Normalize();
52
53 // タッチパネルのコリジョンを設定します。
54 m_Collision.SetRect( 40, 70, 160, 160 );
55 }
56
57
58 //----------------------------------------
59 // メッセージ受信
ReceveMessage(SmMessageType type,void * object,uint targetId)60 bool SmTouchPanelCamera::ReceveMessage( SmMessageType type, void* object, uint targetId )
61 {
62 NW_UNUSED_VARIABLE(targetId);
63
64 SmTouchPanelStatus* touchPanelStaus = NULL;
65
66 bool ret = false;
67
68 switch( type )
69 {
70 case SM_MESSAGE_TUCHPANEL_PRESS:
71 {
72 touchPanelStaus = static_cast<SmTouchPanelStatus*>(object);
73 NW_NULL_ASSERT( touchPanelStaus );
74
75 if ( m_Collision.CheckInner( touchPanelStaus->GetX(), touchPanelStaus->GetY() ) )
76 {
77 // 他処理で使用中でなければ
78 if ( !touchPanelStaus->IsGrab() )
79 {
80 // 掴む
81 touchPanelStaus->Grab();
82 m_IsGrab = true;
83 }
84 }
85 }
86 break;
87
88 case SM_MESSAGE_TUCHPANEL_MOTION:
89 {
90 touchPanelStaus = static_cast<SmTouchPanelStatus*>(object);
91 NW_NULL_ASSERT( touchPanelStaus );
92
93 // カメラを更新
94 if ( m_IsGrab )
95 {
96 // 座標を更新
97 m_TouchPanelPosLastX = static_cast<s32>( m_TouchPanelPosX );
98 m_TouchPanelPosLastY = static_cast<s32>( m_TouchPanelPosY );
99 m_TouchPanelPosX = static_cast<s32>( touchPanelStaus->GetX() );
100 m_TouchPanelPosY = static_cast<s32>( touchPanelStaus->GetY() );
101
102 // カメラを計算
103 calcCamera();
104 }
105 }
106 break;
107
108 case SM_MESSAGE_TUCHPANEL_RELEASE:
109 {
110 touchPanelStaus = static_cast<SmTouchPanelStatus*>(object);
111 NW_NULL_ASSERT( touchPanelStaus );
112
113 // 放す
114 if ( m_IsGrab )
115 {
116 touchPanelStaus->UnGrab();
117 m_IsGrab = false;
118 }
119 }
120 break;
121
122 default:
123 break;
124 }
125
126 return ret;
127 }
128
129
130 //----------------------------------------
131 // 描画
Render()132 void SmTouchPanelCamera::Render()
133 {
134 Sm2DDynamicPrimPC prim;
135 if ( prim.Begin( 4, GL_TRIANGLE_STRIP, 0.f, 0.f ) )
136 {
137 prim.SetVertex( m_Collision.GetX(), m_Collision.GetY(), nw::ut::Color8::YELLOW );
138 prim.SetVertex( m_Collision.GetX(), m_Collision.GetY() + m_Collision.GetHeight(), nw::ut::Color8::YELLOW );
139 prim.SetVertex( m_Collision.GetX() + m_Collision.GetWidth(), m_Collision.GetY(), nw::ut::Color8::YELLOW );
140 prim.SetVertex( m_Collision.GetX() + m_Collision.GetWidth(), m_Collision.GetY() + m_Collision.GetHeight(), nw::ut::Color8::YELLOW );
141 prim.End();
142 }
143
144 if ( m_IsGrab )
145 {
146 if ( prim.Begin( 4, GL_TRIANGLE_STRIP, 0.f, 0.f ) )
147 {
148 prim.SetVertex( m_TouchPanelPosX, m_TouchPanelPosY, nw::ut::Color8::RED );
149 prim.SetVertex( m_TouchPanelPosX, m_TouchPanelPosY + 4.f, nw::ut::Color8::RED );
150 prim.SetVertex( m_TouchPanelPosX + 4.f, m_TouchPanelPosY, nw::ut::Color8::RED );
151 prim.SetVertex( m_TouchPanelPosX + 4.f, m_TouchPanelPosY + 4.f, nw::ut::Color8::RED );
152 prim.End();
153 }
154 }
155 }
156
157
158 //----------------------------------------
159 // ウォークスルーカメラ計算
calcCamera()160 void SmTouchPanelCamera::calcCamera()
161 {
162 nw::math::MTX34 matrixRaotY;
163 matrixRaotY.SetupIdentity();
164
165 nw::math::VEC3 toward;
166
167 f32 degX = 0.f;
168
169 // 画面中央左右で首振り
170 {
171 #define _DEGREE_SPEED (0.3f)
172 #define _DEGREE_MAX (15.f)
173
174 s32 centerX = m_Collision.GetX() + m_Collision.GetWidth()/2.f;
175 s32 centerY = m_Collision.GetY() + m_Collision.GetHeight()/2.f;
176
177 if ( m_TouchPanelPosX < centerX )
178 {
179 if ( m_DegY < _DEGREE_MAX )
180 {
181 m_DegY += _DEGREE_SPEED;
182 }
183 }
184 else
185 {
186 if ( m_DegY > -_DEGREE_MAX )
187 {
188 m_DegY -= _DEGREE_SPEED;
189 }
190 }
191
192 if ( m_TouchPanelPosY < centerY )
193 {
194 if ( m_DegX < _DEGREE_MAX )
195 {
196 m_DegX += _DEGREE_SPEED;
197 }
198 }
199 else
200 {
201 if ( m_DegX > -_DEGREE_MAX )
202 {
203 m_DegX -= _DEGREE_SPEED;
204 }
205 }
206 }
207
208 // 向きを更新
209 MTX34RotXYZDeg( &matrixRaotY, m_DegX, m_DegY, 0.f );
210 VEC3TransformNormal( &toward, &matrixRaotY, &m_CameraToward );
211
212 // 位置と向きから注視点
213 m_CameraTarget.x = m_CameraPos.x + toward.x * 10.f;
214 m_CameraTarget.y = m_CameraPos.y + toward.y * 10.f;
215 m_CameraTarget.z = m_CameraPos.z + toward.z * 10.f;
216
217 // カメラ更新
218 updateCamera();
219 }
220
221
222 //----------------------------------------
223 // カメラ更新
updateCamera()224 void SmTouchPanelCamera::updateCamera()
225 {
226 // todo:
227 // 無効
228 if ( !GetEnable() ) return;
229
230 m_SmCamera->SetPosition( &m_CameraPos );
231 m_SmCamera->SetTarget( &m_CameraTarget );
232 }
233
234
235 } // namespace
236
237
238