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