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