//=========================================================
//=========================================================
void CWeaponGravityGun::PrimaryAttack( void )
{
	if ( !m_active )
	{
		SendWeaponAnim( ACT_VM_PRIMARYATTACK );
		EffectCreate();
		SoundCreate();
	}
	else
	{
		EffectUpdate();
		SoundUpdate();
	}
}
u32 IgfxTexture::sInitSys()
{
	//create sprite interface
	D3DXCreateSprite(g_p3DDevice, &s_pTxtSprite);

	//create effect
	s_txtEffect = EffectCreate(L"Texture3DBlt", g_txtFXBuff);

	//create the texture 3d vtx
	s_pTxtVtxBuff = GFXCreateVtxBuff(sizeof(txtVSVertex), MAXVTX, VTXBUFF_USAGE, VERTEXFLAG, (GFXPOOL)VTXBUFF_POOL);

	if(!s_pTxtVtxBuff)
	{ LogMsg(LOG_FILE, L"IgfxTexture::sInitSys", L"Error creating texture 3d vtx"); return FALSE; }

	//create the texture billboard vtx
	s_pTxtBBVtxBuff = GFXCreateVtxBuff(sizeof(txtVSVertex), MAXVTX, VTXBUFF_USAGE, VERTEXFLAG, (GFXPOOL)VTXBUFF_POOL);

	if(!s_pTxtBBVtxBuff)
	{ LogMsg(LOG_FILE, L"IgfxTexture::sInitSys", L"Error creating texture billboard vtx"); return FALSE; }

	//////////////////////////////////////////////////
	//now let's set the vertex declaration
	D3DVERTEXELEMENT9 Declaration[3];
    D3DVERTEXELEMENT9 End = D3DDECL_END();

	Declaration[0].Stream = 0;
	Declaration[0].Offset = 0;
	Declaration[0].Type = D3DDECLTYPE_FLOAT3;
	Declaration[0].Method = D3DDECLMETHOD_DEFAULT;
	Declaration[0].Usage = D3DDECLUSAGE_POSITION;
	Declaration[0].UsageIndex = 0;

	Declaration[1].Stream = 0;
	Declaration[1].Offset = sizeof(f32)*3;
	Declaration[1].Type = D3DDECLTYPE_FLOAT3;
	Declaration[1].Method = D3DDECLMETHOD_DEFAULT;
	Declaration[1].Usage = D3DDECLUSAGE_TEXCOORD;
	Declaration[1].UsageIndex = 0;

	Declaration[2] = End;

	VtxSetDecl(s_pTxtVtxBuff, Declaration);
	VtxSetDecl(s_pTxtBBVtxBuff, Declaration);
	//////////////////////////////////////////////////

	//set the vertex data
	txtVSVertex *pTVtx, *pTBBVtx;

	VtxLock(s_pTxtVtxBuff, 0, 0,0, (void**)&pTVtx, 0);
	VtxLock(s_pTxtBBVtxBuff, 0, 0,0, (void**)&pTBBVtx, 0);

	/*

		d-------c
		|	    |
		|       |
		|       |
		a-------b

	*/

	pTVtx[0].x = -1.0f;  pTVtx[0].y = -1.0f; pTVtx[0].z = 0.0f;
	
	pTVtx[1].x = 1.0f;  pTVtx[1].y = -1.0f; pTVtx[1].z = 0.0f;
	
	pTVtx[2].x = 1.0f; pTVtx[2].y = 1.0f; pTVtx[2].z = 0.0f;
	
	pTVtx[3].x = -1.0f; pTVtx[3].y = 1.0f; pTVtx[3].z = 0.0f;

	//Top Left
	pTVtx[0].s = 0;
	pTVtx[0].t = 1;
	pTVtx[0].u = 1;

	//Bottom Left
	pTVtx[1].s = 1;
	pTVtx[1].t = 1;
	pTVtx[1].u = 1;

	//Bottom Right
	pTVtx[2].s = 1;
	pTVtx[2].t = 0;
	pTVtx[2].u = 1;

	//Top Right
	pTVtx[3].s = 0;
	pTVtx[3].t = 0;
	pTVtx[3].u = 1;

	memcpy(pTBBVtx, pTVtx, sizeof(txtVSVertex)*4);

	VtxUnlock(s_pTxtVtxBuff, 0);
	VtxUnlock(s_pTxtBBVtxBuff, 0);

	return TRUE;
}
DownmixerBufferProvider::DownmixerBufferProvider(
        audio_channel_mask_t inputChannelMask,
        audio_channel_mask_t outputChannelMask, audio_format_t format,
        uint32_t sampleRate, int32_t sessionId, size_t bufferFrameCount) :
        CopyBufferProvider(
            audio_bytes_per_sample(format) * audio_channel_count_from_out_mask(inputChannelMask),
            audio_bytes_per_sample(format) * audio_channel_count_from_out_mask(outputChannelMask),
            bufferFrameCount)  // set bufferFrameCount to 0 to do in-place
{
    ALOGV("DownmixerBufferProvider(%p)(%#x, %#x, %#x %u %d)",
            this, inputChannelMask, outputChannelMask, format,
            sampleRate, sessionId);
    if (!sIsMultichannelCapable
            || EffectCreate(&sDwnmFxDesc.uuid,
                    sessionId,
                    SESSION_ID_INVALID_AND_IGNORED,
                    &mDownmixHandle) != 0) {
         ALOGE("DownmixerBufferProvider() error creating downmixer effect");
         mDownmixHandle = NULL;
         return;
     }
     // channel input configuration will be overridden per-track
     mDownmixConfig.inputCfg.channels = inputChannelMask;   // FIXME: Should be bits
     mDownmixConfig.outputCfg.channels = outputChannelMask; // FIXME: should be bits
     mDownmixConfig.inputCfg.format = format;
     mDownmixConfig.outputCfg.format = format;
     mDownmixConfig.inputCfg.samplingRate = sampleRate;
     mDownmixConfig.outputCfg.samplingRate = sampleRate;
     mDownmixConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
     mDownmixConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_WRITE;
     // input and output buffer provider, and frame count will not be used as the downmix effect
     // process() function is called directly (see DownmixerBufferProvider::getNextBuffer())
     mDownmixConfig.inputCfg.mask = EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS |
             EFFECT_CONFIG_FORMAT | EFFECT_CONFIG_ACC_MODE;
     mDownmixConfig.outputCfg.mask = mDownmixConfig.inputCfg.mask;

     int cmdStatus;
     uint32_t replySize = sizeof(int);

     // Configure downmixer
     status_t status = (*mDownmixHandle)->command(mDownmixHandle,
             EFFECT_CMD_SET_CONFIG /*cmdCode*/, sizeof(effect_config_t) /*cmdSize*/,
             &mDownmixConfig /*pCmdData*/,
             &replySize, &cmdStatus /*pReplyData*/);
     if (status != 0 || cmdStatus != 0) {
         ALOGE("DownmixerBufferProvider() error %d cmdStatus %d while configuring downmixer",
                 status, cmdStatus);
         EffectRelease(mDownmixHandle);
         mDownmixHandle = NULL;
         return;
     }

     // Enable downmixer
     replySize = sizeof(int);
     status = (*mDownmixHandle)->command(mDownmixHandle,
             EFFECT_CMD_ENABLE /*cmdCode*/, 0 /*cmdSize*/, NULL /*pCmdData*/,
             &replySize, &cmdStatus /*pReplyData*/);
     if (status != 0 || cmdStatus != 0) {
         ALOGE("DownmixerBufferProvider() error %d cmdStatus %d while enabling downmixer",
                 status, cmdStatus);
         EffectRelease(mDownmixHandle);
         mDownmixHandle = NULL;
         return;
     }

     // Set downmix type
     // parameter size rounded for padding on 32bit boundary
     const int psizePadded = ((sizeof(downmix_params_t) - 1)/sizeof(int) + 1) * sizeof(int);
     const int downmixParamSize =
             sizeof(effect_param_t) + psizePadded + sizeof(downmix_type_t);
     effect_param_t * const param = (effect_param_t *) malloc(downmixParamSize);
     CHECK(param != NULL);
     param->psize = sizeof(downmix_params_t);
     const downmix_params_t downmixParam = DOWNMIX_PARAM_TYPE;
     memcpy(param->data, &downmixParam, param->psize);
     const downmix_type_t downmixType = DOWNMIX_TYPE_FOLD;
     param->vsize = sizeof(downmix_type_t);
     memcpy(param->data + psizePadded, &downmixType, param->vsize);
     replySize = sizeof(int);
     status = (*mDownmixHandle)->command(mDownmixHandle,
             EFFECT_CMD_SET_PARAM /* cmdCode */, downmixParamSize /* cmdSize */,
             param /*pCmdData*/, &replySize, &cmdStatus /*pReplyData*/);
     free(param);
     if (status != 0 || cmdStatus != 0) {
         ALOGE("DownmixerBufferProvider() error %d cmdStatus %d while setting downmix type",
                 status, cmdStatus);
         EffectRelease(mDownmixHandle);
         mDownmixHandle = NULL;
         return;
     }
     ALOGV("DownmixerBufferProvider() downmix type set to %d", (int) downmixType);
}