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