devsoundextensions/effects/OrientationBase/src/OrientationBase.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
* All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
* Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
* Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
* Description:   Implementation of the Orientation effect base class
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
// INCLUDE FILES
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
#include <e32svr.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
#include <OrientationBase.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
#include <e32math.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
#include <math.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
//360 degrees:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
#define TWO_PI 6283
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
//180 degrees:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
#define PI 3142
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
//90 degrees:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
#define QUARTER_PI 1570
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
// ============================ MEMBER FUNCTIONS ===============================
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
// COrientation::COrientation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
// C++ default constructor can NOT contain any code, that
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
// might leave.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
EXPORT_C COrientation::COrientation()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
    : 	iOrientationData(0,0,0,0,0,0,0,0,0),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
    	iDataPckgTo(iOrientationData),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
    	iDataPckgFrom(iOrientationData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
// Destructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
EXPORT_C COrientation::~COrientation()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
// COrientation::Orientation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
EXPORT_C void COrientation::Orientation(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	TInt32& aHeading, TInt32& aPitch, TInt32& aRoll )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
	aHeading = iOrientationData.iHeading;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
	aPitch = iOrientationData.iPitch;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
	aRoll = iOrientationData.iRoll;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
// COrientation::OrientationVectors
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
EXPORT_C void COrientation::OrientationVectors(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
	TInt32& aFrontX, TInt32& aFrontY, TInt32& aFrontZ,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
	TInt32& aAboveX, TInt32& aAboveY, TInt32& aAboveZ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	aFrontX = iOrientationData.iFrontX;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	aFrontY = iOrientationData.iFrontY;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	aFrontZ = iOrientationData.iFrontZ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	aAboveX = iOrientationData.iAboveX;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	aAboveY = iOrientationData.iAboveY;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	aAboveZ = iOrientationData.iAboveZ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
// COrientation::SetOrientationL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
EXPORT_C void COrientation::SetOrientationL(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
	TInt32 aHeading, TInt32 aPitch, TInt32 aRoll )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
    while(aPitch > PI) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
      {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
	  aPitch = aPitch - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
      }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
    if(aPitch > QUARTER_PI) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
      {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
	  //pitch is here between 90 and 180degs. We swap it back to between 0 and 90degs. Heading needs swaping then too.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
	  aPitch = aPitch - (aPitch-QUARTER_PI)*2;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
	  aHeading = aHeading + PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
	  aRoll = aRoll + PI; //I'm not sure if this line is needed. Remove it if you don't get correct results for roll or upVector
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
      }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
    while(aPitch < -PI) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
      {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
   	 aPitch = aPitch + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
      }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
     
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
     if(aPitch < -QUARTER_PI) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
     {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
	  //pitch is here between -90 and -180degs. We swap it back to between 0 and -90degs. Heading needs swaping then too.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	  aPitch = aPitch + (QUARTER_PI-aPitch)*2;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	  aHeading = aHeading + PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
	  aRoll = aRoll + PI; //I'm not sure if this line is needed. Remove it if you don't get correct results for roll or upVector
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
     }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
     while (aHeading < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
     {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
	    aHeading = aHeading + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
	 }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
     
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
     while (aHeading > TWO_PI)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
     {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	    aHeading = aHeading - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
     }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
     
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
     while (aRoll < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
     {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
        aRoll = aRoll + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
     }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
     while (aRoll > TWO_PI)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
     {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	    aRoll = aRoll - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
     }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
    iOrientationData.iHeading = aHeading;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
	iOrientationData.iPitch = aPitch;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	iOrientationData.iRoll = aRoll;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
    TReal headingSin, headingCos, pitchSin, pitchCos, rollSin, rollCos;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
    User::LeaveIfError( Math::Sin( headingSin, (TReal)aHeading / 1000 ) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
    User::LeaveIfError( Math::Cos( headingCos, (TReal)aHeading / 1000) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
    User::LeaveIfError( Math::Sin( pitchSin, (TReal)aPitch / 1000) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
    User::LeaveIfError( Math::Cos( pitchCos, (TReal)aPitch / 1000) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
    User::LeaveIfError( Math::Sin( rollSin, (TReal)aRoll / 1000) );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
    User::LeaveIfError( Math::Cos( rollCos, (TReal)aRoll / 1000) );   
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
        		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
    iOrientationData.iFrontX = -headingSin * pitchCos * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
    iOrientationData.iFrontY = pitchSin * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
    iOrientationData.iFrontZ = -headingCos * pitchCos * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
    iOrientationData.iAboveX = (-rollSin * headingCos + rollCos * pitchSin * headingSin) * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
    iOrientationData.iAboveY = pitchCos * rollCos * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
    iOrientationData.iAboveZ = (rollSin * headingSin + rollCos * headingCos * pitchSin) * 1000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
// COrientation::SetOrientationVectorsL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
EXPORT_C void COrientation::SetOrientationVectorsL(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
	TInt32 aFrontX, TInt32 aFrontY, TInt32 aFrontZ,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
	TInt32 aAboveX, TInt32 aAboveY, TInt32 aAboveZ )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
    iOrientationData.iFrontX = aFrontX;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	iOrientationData.iFrontY = aFrontY;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
	iOrientationData.iFrontZ = aFrontZ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
	iOrientationData.iAboveX = aAboveX;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
	iOrientationData.iAboveY = aAboveY;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
	iOrientationData.iAboveZ = aAboveZ;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
	TInt32 previous_valid_value_of_pitch = iOrientationData.iPitch;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	if(!((aFrontX==0) && (aFrontZ==0))) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
		TReal xDividedByZAtan;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
        xDividedByZAtan = atan2 (-aFrontX, -aFrontZ);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
        if(xDividedByZAtan > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
	      iOrientationData.iHeading = (TInt32) (xDividedByZAtan * 1000 + 0.5);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
        else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
 	      iOrientationData.iHeading = (TInt32) (xDividedByZAtan * 1000 - 0.5);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
  
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
    if(aFrontX == 0 && aFrontZ == 0) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
	  if (aFrontY > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
	     iOrientationData.iPitch = KPi/2 * 1000 + 0.5; //verify the units!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
	  else if (aFrontY == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
	     iOrientationData.iPitch = previous_valid_value_of_pitch;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
	  else if (aFrontY < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
	     iOrientationData.iPitch = -KPi/2 * 1000 - 0.5; //verify the units!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
    } 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
    else 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
      TReal sqrtXZ = 0, squareFx = 0, squareFz = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
      Math::Pow(squareFx, aFrontX, 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
      Math::Pow(squareFz, aFrontZ, 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
      TReal total = squareFx + squareFz;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
      Math::Sqrt (sqrtXZ, total);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
      
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
      TReal yTotalAtan =  atan2 ((TReal)aFrontY, sqrtXZ);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
      
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
      if (yTotalAtan > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
   	    iOrientationData.iPitch = (TInt32) (yTotalAtan * 1000 + 0.5);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
      else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
    	 iOrientationData.iPitch = (TInt32) (yTotalAtan * 1000 - 0.5);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
     
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
     }  
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
    TReal rot_aboveX = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
    rot_aboveX = cos(-((TReal)iOrientationData.iHeading)/1000) * (((TReal)aAboveX)/1000) + sin(-((TReal)iOrientationData.iHeading)/1000) * (((TReal)aAboveZ)/1000);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
    TReal rot_aboveY = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
    rot_aboveY = sin(-((TReal)iOrientationData.iHeading)/1000) * sin(-((TReal)iOrientationData.iPitch)/1000) * (((TReal)aAboveX)/1000) + cos(-((TReal)iOrientationData.iPitch)/1000) * (((TReal)aAboveY)/1000) - sin(-(TReal)iOrientationData.iPitch/1000) * cos(-((TReal)iOrientationData.iHeading)/1000)* (((TReal)aAboveZ)/1000);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
    TReal roll = atan2(-rot_aboveX, rot_aboveY);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
   	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
   	if (roll > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
   	  iOrientationData.iRoll = (TInt32) (roll * 1000 + 0.5);  
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
   	  iOrientationData.iRoll = (TInt32) (roll * 1000 - 0.5);  
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
     while (iOrientationData.iHeading < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
	    iOrientationData.iHeading = iOrientationData.iHeading + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
     while (iOrientationData.iHeading > TWO_PI)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
	    iOrientationData.iHeading = iOrientationData.iHeading - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
     while (iOrientationData.iPitch < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
	    iOrientationData.iPitch = iOrientationData.iPitch + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
	    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
     while (iOrientationData.iPitch > TWO_PI)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
	    iOrientationData.iPitch = iOrientationData.iPitch - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
	    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
     while (iOrientationData.iRoll < 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	    iOrientationData.iRoll = iOrientationData.iRoll + TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
     
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
     while (iOrientationData.iRoll > TWO_PI)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
	    iOrientationData.iRoll = iOrientationData.iRoll - TWO_PI;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
// COrientation::DoEffectData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
EXPORT_C const TDesC8& COrientation::DoEffectData()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
    RDebug::Print(_L("COrientation::DoEffectData"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
	iDataPckgTo = iOrientationData;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
	return iDataPckgTo;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
// COrientation::SetEffectData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
EXPORT_C void COrientation::SetEffectData(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
	const TDesC8& aEffectDataBuffer )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
    RDebug::Print(_L("COrientation::SetEffectData"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
	TEfOrientationDataPckg dataPckg;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
	dataPckg.Copy(aEffectDataBuffer);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
	iOrientationData = dataPckg();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
	iEnabled = iOrientationData.iEnabled;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
	iEnforced = iOrientationData.iEnforced;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
	iHaveUpdateRights = iOrientationData.iHaveUpdateRights;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
// ========================== OTHER EXPORTED FUNCTIONS =========================
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
// End of File