diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alfproceduralmesh.cpp --- /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 + +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 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 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 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 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 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 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; + }