uiacceltk/hitchcock/Client/src/alfproceduralmesh.cpp
changeset 0 15bf7259bb7c
equal deleted inserted replaced
-1:000000000000 0:15bf7259bb7c
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   Procedural 3D Mesh
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "alf/alfproceduralmesh.h"
       
    21 #include "alf/alfgencomponent.h"
       
    22 #include "alflogger.h"
       
    23 #include "alf/alfconstants.h"
       
    24 #include "alf/alfenv.h"
       
    25 #include "alfskinnableimage.h"
       
    26 
       
    27 #include <uiacceltk/HuiUtil.h>
       
    28 
       
    29 struct CAlfProceduralMesh::TProceduralMeshPrivateData
       
    30     {
       
    31     CAlfGenComponent* iComms; // Not owned
       
    32     TAlfMaterial iMaterial;      
       
    33     CAlfSkinnableImage* iMaterialTextureImage;
       
    34     CAlfSkinnableImage* iMaterialSpecularImage;
       
    35     };
       
    36 
       
    37 // ======== MEMBER FUNCTIONS ========
       
    38 
       
    39 
       
    40 // ---------------------------------------------------------------------------
       
    41 // Constructor
       
    42 // ---------------------------------------------------------------------------
       
    43 //
       
    44 CAlfProceduralMesh::CAlfProceduralMesh()
       
    45     {
       
    46     }
       
    47 
       
    48 
       
    49 // ---------------------------------------------------------------------------
       
    50 // Second phase constructor
       
    51 // ---------------------------------------------------------------------------
       
    52 //
       
    53 void CAlfProceduralMesh::ConstructL( CAlfGenComponent& aComms )
       
    54     {
       
    55     // Construct the base class
       
    56     CAlfMesh::ConstructL(aComms, EAlfMeshTypeProcedural);
       
    57     
       
    58     // Create object data.
       
    59     iData = new (ELeave) TProceduralMeshPrivateData;
       
    60     
       
    61     // Zero all object data
       
    62     iData->iComms = NULL;
       
    63     iData->iMaterialTextureImage = NULL;
       
    64     iData->iMaterialSpecularImage = NULL;
       
    65     
       
    66     // Fill data
       
    67     iData->iComms = &aComms;
       
    68     iData->iMaterial.iPreset = EAlfMaterialChrome;  
       
    69     
       
    70     CAlfEnv* env = CAlfEnv::Static();
       
    71     iData->iMaterialTextureImage = new (ELeave) CAlfSkinnableImage(env);
       
    72     iData->iMaterialSpecularImage = new (ELeave) CAlfSkinnableImage(env);  
       
    73     
       
    74     // Create input and output buffers for inter-process communication
       
    75     TBuf8<1> outDummy;
       
    76     TInt param = EAlfMeshTypeProcedural;
       
    77     TPckgC<TInt> buf(param);
       
    78         
       
    79     // Call a synchronous command to create an associated server-side procedural mesh.
       
    80     TInt err = iData->iComms->DoSynchronousCmd(EAlfMeshVisualCreateMesh, buf, outDummy);
       
    81     if (err)
       
    82         {
       
    83         __ALFLOGSTRING1( "CAlfProceduralMesh::ConstructL leave error %d", err )
       
    84         User::Leave( err );
       
    85         }   
       
    86     }
       
    87 
       
    88 
       
    89 // ---------------------------------------------------------------------------
       
    90 // Exposed constructor
       
    91 // ---------------------------------------------------------------------------
       
    92 //
       
    93 CAlfProceduralMesh* CAlfProceduralMesh::NewL( CAlfGenComponent& aComms )
       
    94     {
       
    95     CAlfProceduralMesh* self = new( ELeave ) CAlfProceduralMesh;
       
    96     CleanupStack::PushL( self );
       
    97     self->ConstructL( aComms );
       
    98     CleanupStack::Pop( self );
       
    99     return self;
       
   100     }
       
   101 
       
   102 // ---------------------------------------------------------------------------
       
   103 // Destructor
       
   104 // ---------------------------------------------------------------------------
       
   105 //
       
   106 CAlfProceduralMesh::~CAlfProceduralMesh()
       
   107     {
       
   108     if ( iData )
       
   109         {
       
   110         delete iData->iMaterialTextureImage;
       
   111         iData->iMaterialTextureImage = NULL;
       
   112         
       
   113         delete iData->iMaterialSpecularImage;
       
   114         iData->iMaterialSpecularImage = NULL;
       
   115         }
       
   116     delete iData;
       
   117     iData = NULL;
       
   118     }
       
   119 
       
   120 // ---------------------------------------------------------------------------
       
   121 // Forms a cube mesh to this procedural mesh.
       
   122 // ---------------------------------------------------------------------------
       
   123 //
       
   124 EXPORT_C void CAlfProceduralMesh::MakeCubeL(
       
   125         TReal32 aSizeX, 
       
   126         TReal32 aSizeY, 
       
   127         TReal32 aSizeZ, 
       
   128         TReal32 aEdgeRadius) __SOFTFP
       
   129     {
       
   130     RArray<TReal32> array;
       
   131     CleanupClosePushL( array );
       
   132     
       
   133     array.AppendL( aSizeX );
       
   134     array.AppendL( aSizeY );
       
   135     array.AppendL( aSizeZ );
       
   136     array.AppendL( aEdgeRadius );
       
   137     
       
   138     HBufC8* buffer = ExternalizeLC(array);
       
   139     TBuf8<1> outDummy;
       
   140     
       
   141     TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeCube, *buffer, outDummy);
       
   142     if (err)
       
   143         {
       
   144         __ALFLOGSTRING1( "CAlfProceduralMesh::MakeCubeL leave error %d", err )
       
   145         User::Leave( err );
       
   146         }
       
   147         
       
   148     CleanupStack::PopAndDestroy( buffer );
       
   149     CleanupStack::PopAndDestroy( &array );
       
   150     }
       
   151 
       
   152 // ---------------------------------------------------------------------------
       
   153 // Forms a sphere mesh to this procedural mesh.
       
   154 // ---------------------------------------------------------------------------
       
   155 //
       
   156 EXPORT_C void CAlfProceduralMesh::MakeSphereL(
       
   157         TReal32 aRadius, 
       
   158         TInt aColumns, 
       
   159         TInt aRows) __SOFTFP
       
   160     {
       
   161     RArray<TReal32> array;
       
   162     CleanupClosePushL( array );
       
   163     
       
   164     array.AppendL( aRadius );
       
   165     array.AppendL( (TReal32)aColumns );
       
   166     array.AppendL( (TReal32)aRows );
       
   167     
       
   168     HBufC8* buffer = ExternalizeLC(array);
       
   169     TBuf8<1> outDummy;
       
   170     
       
   171     TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeSphere, *buffer, outDummy);
       
   172     if (err)
       
   173         {
       
   174         __ALFLOGSTRING1( "CAlfProceduralMesh::MakeSphereL leave error %d", err )
       
   175         User::Leave( err );
       
   176         }
       
   177         
       
   178     CleanupStack::PopAndDestroy( buffer );
       
   179     CleanupStack::PopAndDestroy( &array );
       
   180     }
       
   181 
       
   182 // ---------------------------------------------------------------------------
       
   183 // Forms a torus mesh to this procedural mesh.
       
   184 // ---------------------------------------------------------------------------
       
   185 //
       
   186 EXPORT_C void CAlfProceduralMesh::MakeTorusL(
       
   187         TReal32 aMainRadius, 
       
   188         TReal32 aOuterRadius, 
       
   189         TInt aMainSegments, 
       
   190         TInt aOuterSegments,
       
   191         TReal32 aSegmentAngleOffset ) __SOFTFP
       
   192     {
       
   193     RArray<TReal32> array;
       
   194     CleanupClosePushL( array );
       
   195     
       
   196     array.AppendL( aMainRadius );
       
   197     array.AppendL( aOuterRadius );
       
   198     array.AppendL( (TReal32)aMainSegments );
       
   199     array.AppendL( (TReal32)aOuterSegments );
       
   200     array.AppendL( aSegmentAngleOffset );
       
   201     
       
   202     HBufC8* buffer = ExternalizeLC(array);
       
   203     TBuf8<1> outDummy;
       
   204     
       
   205     TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeTorus, *buffer, outDummy);
       
   206     if (err)
       
   207         {
       
   208         __ALFLOGSTRING1( "CAlfProceduralMesh::MakeTorusL leave error %d", err )
       
   209         User::Leave( err );
       
   210         }
       
   211     
       
   212     CleanupStack::PopAndDestroy( buffer );
       
   213     CleanupStack::PopAndDestroy( &array );
       
   214     }
       
   215     
       
   216 // ---------------------------------------------------------------------------
       
   217 // Returns the material definition of this mesh.
       
   218 // ---------------------------------------------------------------------------
       
   219 //
       
   220 EXPORT_C const TAlfMaterial& CAlfProceduralMesh::Material() const
       
   221     {
       
   222     TAlfMaterialParams params; 
       
   223     TPckg<TAlfMaterialParams> buf(params);
       
   224     TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMaterial, KNullDesC8, buf);
       
   225 
       
   226     if ( err != KErrNone )
       
   227         {
       
   228         __ALFLOGSTRING1( "CAlfProceduralMesh::Material panic error %d", err )
       
   229         USER_INVARIANT();
       
   230         }
       
   231     
       
   232     iData->iMaterial.iSpecular = params.iSpecular;
       
   233     iData->iMaterial.iTextureImage = iData->iMaterialTextureImage->Image();
       
   234     iData->iMaterial.iSpecularImage = iData->iMaterialSpecularImage->Image();
       
   235     
       
   236     return iData->iMaterial;
       
   237     }
       
   238     
       
   239 // ---------------------------------------------------------------------------
       
   240 // Sets the material definition used with this mesh.
       
   241 // ---------------------------------------------------------------------------
       
   242 //    
       
   243 EXPORT_C void CAlfProceduralMesh::SetMaterial( const TAlfMaterial& aMaterial )
       
   244     {
       
   245     iData->iMaterialTextureImage->SetImage( aMaterial.iTextureImage );
       
   246     iData->iMaterialSpecularImage->SetImage( aMaterial.iSpecularImage );
       
   247 
       
   248     TAlfMaterialParams params;
       
   249     TPckgC<TAlfMaterialParams> buf(params);
       
   250     
       
   251     params.iPreset = aMaterial.iPreset;
       
   252     params.iColor = aMaterial.iColor;
       
   253     params.iTextureImage.iTextureHandle = 
       
   254         iData->iMaterialTextureImage->Image().HasTexture() ? 
       
   255             iData->iMaterialTextureImage->Image().Texture().ServerHandle() 
       
   256             : 0 ;
       
   257     params.iTextureImage.iTl = iData->iMaterialTextureImage->Image().TimedTopLeft();
       
   258     params.iTextureImage.iBr = iData->iMaterialTextureImage->Image().TimedBottomRight();
       
   259     params.iSpecularImage.iTextureHandle = 
       
   260         iData->iMaterialSpecularImage->Image().HasTexture() ? 
       
   261             iData->iMaterialSpecularImage->Image().Texture().ServerHandle() 
       
   262             : 0 ;
       
   263     params.iSpecularImage.iTl = iData->iMaterialSpecularImage->Image().TimedTopLeft();
       
   264     params.iSpecularImage.iBr = iData->iMaterialSpecularImage->Image().TimedBottomRight();
       
   265     params.iSpecular = aMaterial.iSpecular;
       
   266     
       
   267     TInt err = iData->iComms->DoCmdNoReply( EAlfMeshSetMaterial, buf );
       
   268 
       
   269     if ( err == KErrNone )
       
   270         {
       
   271         iData->iMaterial = aMaterial;
       
   272         }
       
   273     else
       
   274         {
       
   275         __ALFLOGSTRING1( "CAlfProceduralMesh::SetMaterial panic error %d", err )
       
   276         USER_INVARIANT();
       
   277         }
       
   278     }
       
   279     
       
   280 // ---------------------------------------------------------------------------
       
   281 // Sets specular image of the material.
       
   282 // ---------------------------------------------------------------------------
       
   283 //     
       
   284 void CAlfProceduralMesh::SetSpecularImage(const TAlfImage& aImage)
       
   285     {
       
   286     iData->iMaterial.iSpecularImage = aImage;
       
   287     }