uiacceltk/hitchcock/Client/src/alfproceduralmesh.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/Client/src/alfproceduralmesh.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,287 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Procedural 3D Mesh
+*
+*/
+
+
+
+#include "alf/alfproceduralmesh.h"
+#include "alf/alfgencomponent.h"
+#include "alflogger.h"
+#include "alf/alfconstants.h"
+#include "alf/alfenv.h"
+#include "alfskinnableimage.h"
+
+#include <uiacceltk/HuiUtil.h>
+
+struct CAlfProceduralMesh::TProceduralMeshPrivateData
+    {
+    CAlfGenComponent* iComms; // Not owned
+    TAlfMaterial iMaterial;      
+    CAlfSkinnableImage* iMaterialTextureImage;
+    CAlfSkinnableImage* iMaterialSpecularImage;
+    };
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CAlfProceduralMesh::CAlfProceduralMesh()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CAlfProceduralMesh::ConstructL( CAlfGenComponent& aComms )
+    {
+    // Construct the base class
+    CAlfMesh::ConstructL(aComms, EAlfMeshTypeProcedural);
+    
+    // Create object data.
+    iData = new (ELeave) TProceduralMeshPrivateData;
+    
+    // Zero all object data
+    iData->iComms = NULL;
+    iData->iMaterialTextureImage = NULL;
+    iData->iMaterialSpecularImage = NULL;
+    
+    // Fill data
+    iData->iComms = &aComms;
+    iData->iMaterial.iPreset = EAlfMaterialChrome;  
+    
+    CAlfEnv* env = CAlfEnv::Static();
+    iData->iMaterialTextureImage = new (ELeave) CAlfSkinnableImage(env);
+    iData->iMaterialSpecularImage = new (ELeave) CAlfSkinnableImage(env);  
+    
+    // Create input and output buffers for inter-process communication
+    TBuf8<1> outDummy;
+    TInt param = EAlfMeshTypeProcedural;
+    TPckgC<TInt> buf(param);
+        
+    // Call a synchronous command to create an associated server-side procedural mesh.
+    TInt err = iData->iComms->DoSynchronousCmd(EAlfMeshVisualCreateMesh, buf, outDummy);
+    if (err)
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::ConstructL leave error %d", err )
+        User::Leave( err );
+        }   
+    }
+
+
+// ---------------------------------------------------------------------------
+// Exposed constructor
+// ---------------------------------------------------------------------------
+//
+CAlfProceduralMesh* CAlfProceduralMesh::NewL( CAlfGenComponent& aComms )
+    {
+    CAlfProceduralMesh* self = new( ELeave ) CAlfProceduralMesh;
+    CleanupStack::PushL( self );
+    self->ConstructL( aComms );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAlfProceduralMesh::~CAlfProceduralMesh()
+    {
+    if ( iData )
+        {
+        delete iData->iMaterialTextureImage;
+        iData->iMaterialTextureImage = NULL;
+        
+        delete iData->iMaterialSpecularImage;
+        iData->iMaterialSpecularImage = NULL;
+        }
+    delete iData;
+    iData = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// Forms a cube mesh to this procedural mesh.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfProceduralMesh::MakeCubeL(
+        TReal32 aSizeX, 
+        TReal32 aSizeY, 
+        TReal32 aSizeZ, 
+        TReal32 aEdgeRadius) __SOFTFP
+    {
+    RArray<TReal32> array;
+    CleanupClosePushL( array );
+    
+    array.AppendL( aSizeX );
+    array.AppendL( aSizeY );
+    array.AppendL( aSizeZ );
+    array.AppendL( aEdgeRadius );
+    
+    HBufC8* buffer = ExternalizeLC(array);
+    TBuf8<1> outDummy;
+    
+    TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeCube, *buffer, outDummy);
+    if (err)
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::MakeCubeL leave error %d", err )
+        User::Leave( err );
+        }
+        
+    CleanupStack::PopAndDestroy( buffer );
+    CleanupStack::PopAndDestroy( &array );
+    }
+
+// ---------------------------------------------------------------------------
+// Forms a sphere mesh to this procedural mesh.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfProceduralMesh::MakeSphereL(
+        TReal32 aRadius, 
+        TInt aColumns, 
+        TInt aRows) __SOFTFP
+    {
+    RArray<TReal32> array;
+    CleanupClosePushL( array );
+    
+    array.AppendL( aRadius );
+    array.AppendL( (TReal32)aColumns );
+    array.AppendL( (TReal32)aRows );
+    
+    HBufC8* buffer = ExternalizeLC(array);
+    TBuf8<1> outDummy;
+    
+    TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeSphere, *buffer, outDummy);
+    if (err)
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::MakeSphereL leave error %d", err )
+        User::Leave( err );
+        }
+        
+    CleanupStack::PopAndDestroy( buffer );
+    CleanupStack::PopAndDestroy( &array );
+    }
+
+// ---------------------------------------------------------------------------
+// Forms a torus mesh to this procedural mesh.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfProceduralMesh::MakeTorusL(
+        TReal32 aMainRadius, 
+        TReal32 aOuterRadius, 
+        TInt aMainSegments, 
+        TInt aOuterSegments,
+        TReal32 aSegmentAngleOffset ) __SOFTFP
+    {
+    RArray<TReal32> array;
+    CleanupClosePushL( array );
+    
+    array.AppendL( aMainRadius );
+    array.AppendL( aOuterRadius );
+    array.AppendL( (TReal32)aMainSegments );
+    array.AppendL( (TReal32)aOuterSegments );
+    array.AppendL( aSegmentAngleOffset );
+    
+    HBufC8* buffer = ExternalizeLC(array);
+    TBuf8<1> outDummy;
+    
+    TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMakeTorus, *buffer, outDummy);
+    if (err)
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::MakeTorusL leave error %d", err )
+        User::Leave( err );
+        }
+    
+    CleanupStack::PopAndDestroy( buffer );
+    CleanupStack::PopAndDestroy( &array );
+    }
+    
+// ---------------------------------------------------------------------------
+// Returns the material definition of this mesh.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TAlfMaterial& CAlfProceduralMesh::Material() const
+    {
+    TAlfMaterialParams params; 
+    TPckg<TAlfMaterialParams> buf(params);
+    TInt err = iData->iComms->DoSynchronousCmd( EAlfMeshMaterial, KNullDesC8, buf);
+
+    if ( err != KErrNone )
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::Material panic error %d", err )
+        USER_INVARIANT();
+        }
+    
+    iData->iMaterial.iSpecular = params.iSpecular;
+    iData->iMaterial.iTextureImage = iData->iMaterialTextureImage->Image();
+    iData->iMaterial.iSpecularImage = iData->iMaterialSpecularImage->Image();
+    
+    return iData->iMaterial;
+    }
+    
+// ---------------------------------------------------------------------------
+// Sets the material definition used with this mesh.
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CAlfProceduralMesh::SetMaterial( const TAlfMaterial& aMaterial )
+    {
+    iData->iMaterialTextureImage->SetImage( aMaterial.iTextureImage );
+    iData->iMaterialSpecularImage->SetImage( aMaterial.iSpecularImage );
+
+    TAlfMaterialParams params;
+    TPckgC<TAlfMaterialParams> buf(params);
+    
+    params.iPreset = aMaterial.iPreset;
+    params.iColor = aMaterial.iColor;
+    params.iTextureImage.iTextureHandle = 
+        iData->iMaterialTextureImage->Image().HasTexture() ? 
+            iData->iMaterialTextureImage->Image().Texture().ServerHandle() 
+            : 0 ;
+    params.iTextureImage.iTl = iData->iMaterialTextureImage->Image().TimedTopLeft();
+    params.iTextureImage.iBr = iData->iMaterialTextureImage->Image().TimedBottomRight();
+    params.iSpecularImage.iTextureHandle = 
+        iData->iMaterialSpecularImage->Image().HasTexture() ? 
+            iData->iMaterialSpecularImage->Image().Texture().ServerHandle() 
+            : 0 ;
+    params.iSpecularImage.iTl = iData->iMaterialSpecularImage->Image().TimedTopLeft();
+    params.iSpecularImage.iBr = iData->iMaterialSpecularImage->Image().TimedBottomRight();
+    params.iSpecular = aMaterial.iSpecular;
+    
+    TInt err = iData->iComms->DoCmdNoReply( EAlfMeshSetMaterial, buf );
+
+    if ( err == KErrNone )
+        {
+        iData->iMaterial = aMaterial;
+        }
+    else
+        {
+        __ALFLOGSTRING1( "CAlfProceduralMesh::SetMaterial panic error %d", err )
+        USER_INVARIANT();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// Sets specular image of the material.
+// ---------------------------------------------------------------------------
+//     
+void CAlfProceduralMesh::SetSpecularImage(const TAlfImage& aImage)
+    {
+    iData->iMaterial.iSpecularImage = aImage;
+    }