Exemplo n.º 1
0
void Evolution::buildFX()
{
    ID3DXBuffer* errors = 0;
    if ( D3DXCreateEffectFromFile(gd3dDevice, "EvolutionShader.fx", 0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors) )
        if ( !errors )
        {
            MessageBox(0, "EvolutionShader.fx not found! D:", 0, 0);
            PostQuitMessage(0);
        }

    if( errors )
        MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

    mhEFTech = mFX->GetTechniqueByName("EFEvolutionShader");
    mhLTech = mFX->GetTechniqueByName("LEvolutionShader");


    mhWVP			 = mFX->GetParameterByName(0, "gWVP");
    mhTex            = mFX->GetParameterByName(0, "gTex");
    mhTex2           = mFX->GetParameterByName(0, "gTex2");
    mhTex3           = mFX->GetParameterByName(0, "gTex3");

    HR(mFX->SetTexture(mhTex,  mFoodTex));
    HR(mFX->SetTexture(mhTex2, mEggTex));
    HR(mFX->SetTexture(mhTex3, mLifeformTex));
}
////////////////////////////////////////////////////////////////
//
// CEffectTemplateImpl::ValidateDepthBufferUsage
//
// Check if technique passes our rules
// Returns false if should fail validation
//
////////////////////////////////////////////////////////////////
bool CEffectTemplateImpl::ValidateDepthBufferUsage ( D3DXHANDLE hTechnique, SString& strOutErrorExtra )
{
    m_bUsesDepthBuffer = false;

    // Check depthbuffer handle
    D3DXHANDLE hDepthBuffer = m_pD3DEffect->GetParameterByName ( NULL, "DEPTHBUFFER" );
    if ( !hDepthBuffer )
        hDepthBuffer = m_pD3DEffect->GetParameterBySemantic ( NULL, "DEPTHBUFFER" );
    if ( hDepthBuffer )
    {
        D3DXPARAMETER_DESC ParameterDesc;
        m_pD3DEffect->GetParameterDesc ( hDepthBuffer, &ParameterDesc );
        if ( ParameterDesc.Type >= D3DXPT_TEXTURE && ParameterDesc.Type <= D3DXPT_TEXTURECUBE )
        {
            if ( m_pD3DEffect->IsParameterUsed ( hDepthBuffer, hTechnique ) )
            {
                ERenderFormat depthBufferFormat = m_pManager->GetDepthBufferFormat ();
                if ( depthBufferFormat == RFORMAT_UNKNOWN )
                {
                    strOutErrorExtra += " DEPTHBUFFER used, but readable depth buffer is not available";
                    return false;
                }
                m_bUsesDepthBuffer = true;
            }
        }
    }

    return true;
}
Exemplo n.º 3
0
void DiffuseCubeDemo::buildFX()
{
	// Create the FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "diffuse.fx", 
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech                  = mFX->GetTechniqueByName("DiffuseTech");
	mhWVP                   = mFX->GetParameterByName(0, "gWVP");
	mhWorldInverseTranspose = mFX->GetParameterByName(0, "gWorldInverseTranspose");
	mhLightVecW             = mFX->GetParameterByName(0, "gLightVecW");
	mhDiffuseMtrl           = mFX->GetParameterByName(0, "gDiffuseMtrl");
	mhDiffuseLight          = mFX->GetParameterByName(0, "gDiffuseLight");
}
Exemplo n.º 4
0
void WaterDemo::buildFX()
{
    // Create the FX from a .fx file.
    ID3DXBuffer* errors = 0;
    HR(D3DXCreateEffectFromFile(gd3dDevice, "NormalMap.fx",
                                0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
    if( errors )
        MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

    // Obtain handles.
    mhTech       = mFX->GetTechniqueByName("NormalMapTech");
    mhWVP        = mFX->GetParameterByName(0, "gWVP");
    mhWorldInv   = mFX->GetParameterByName(0, "gWorldInv");
    mhMtrl       = mFX->GetParameterByName(0, "gMtrl");
    mhLight      = mFX->GetParameterByName(0, "gLight");
    mhEyePosW    = mFX->GetParameterByName(0, "gEyePosW");
    mhTex        = mFX->GetParameterByName(0, "gTex");
    mhNormalMap  = mFX->GetParameterByName(0, "gNormalMap");

    // Set parameters that do not vary:

    // World is the identity, so inverse is also identity.
    HR(mFX->SetMatrix(mhWorldInv, &mSceneWorldInv));
    HR(mFX->SetTechnique(mhTech));
}
Exemplo n.º 5
0
void TriGridDemo::buildFX()
{
	ID3DXBuffer *errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, L"../src/chap08/TriGridDemo/transform.fx",
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if (errors)
		MessageBoxA(0, (char*)errors->GetBufferPointer(), 0, 0);

	mhTech = mFX->GetTechniqueByName("TransformTech");
	mhWVP  = mFX->GetParameterByName(0, "gWVP");
}
Exemplo n.º 6
0
void Game::buildFX()
{
	// Create the FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "color.fx", 
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech = mFX->GetTechniqueByName("ColorTech");
	mhWVP  = mFX->GetParameterByName(0, "gWVP");
}
Exemplo n.º 7
0
void ProjTexDemo::buildFX()
{
	// Create the FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "ProjTex.fx", 
		0, 0, D3DXSHADER_DEBUG|D3DXSHADER_SKIPOPTIMIZATION, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech            = mFX->GetTechniqueByName("ProjTexTech");
	mhWVP             = mFX->GetParameterByName(0, "gWVP");
	mhLightWVP        = mFX->GetParameterByName(0, "gLightWVP");
	mhWorldInvTrans   = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhMtrl            = mFX->GetParameterByName(0, "gMtrl");
	mhLight           = mFX->GetParameterByName(0, "gLight");
	mhEyePosW         = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld           = mFX->GetParameterByName(0, "gWorld");
	mhTex             = mFX->GetParameterByName(0, "gTex");
}
Exemplo n.º 8
0
void XFileDemo::buildFX()
{
	ID3DXBuffer *errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, L"../src/chap14/XFileDemo/PhongDirLtTex.fx",
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if (errors)
		MessageBoxA(0, (char*)errors->GetBufferPointer(), 0, 0);

	mhTech          = mFX->GetTechniqueByName("PhongDirLtTexTech");
	mhWVP           = mFX->GetParameterByName(0, "gWVP");
	mhWorldInvTrans = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhMtrl          = mFX->GetParameterByName(0, "gMtrl");
	mhLight         = mFX->GetParameterByName(0, "gLight");
	mhEyePos        = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld         = mFX->GetParameterByName(0, "gWorld");
	mhTex           = mFX->GetParameterByName(0, "gTex");
}
Exemplo n.º 9
0
void AmbientDiffuseDemo::buildFX()
{
    ID3DXBuffer *errors = 0;
    HR(D3DXCreateEffectFromFile(gd3dDevice, L"../src/chap10/AmbientDiffuseDemo/ambientdiffuse.fx",
                                0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
    if (errors)
        MessageBoxA(0, (char*)errors->GetBufferPointer(), 0, 0);

    mhTech                  = mFX->GetTechniqueByName("DiffuseTech");
    mhWVP                   = mFX->GetParameterByName(0, "gWVP");
    mhWorldInverseTranspose = mFX->GetParameterByName(0, "gWorldInverseTranspose");
    mhLightVecW             = mFX->GetParameterByName(0, "gLightVecW");
    mhDiffuseMtrl           = mFX->GetParameterByName(0, "gDiffuseMtrl");
    mhDiffuseLight          = mFX->GetParameterByName(0, "gDiffuseLight");
    mhAmbientMtrl           = mFX->GetParameterByName(0, "gAmbientMtrl");
    mhAmbientLight          = mFX->GetParameterByName(0, "gAmbientLight");
}
Exemplo n.º 10
0
void MultiTexDemo::buildFX()
{
	// Create the FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "TerrainMultiTex.fx", 
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech          = mFX->GetTechniqueByName("TerrainMultiTexTech");
	mhWVP           = mFX->GetParameterByName(0, "gWVP");
	mhWorldInvTrans = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhLightVecW     = mFX->GetParameterByName(0, "gLightVecW");
	mhDiffuseMtrl   = mFX->GetParameterByName(0, "gDiffuseMtrl");
	mhDiffuseLight  = mFX->GetParameterByName(0, "gDiffuseLight");
	mhAmbientMtrl   = mFX->GetParameterByName(0, "gAmbientMtrl");
	mhAmbientLight  = mFX->GetParameterByName(0, "gAmbientLight");
	mhSpecularMtrl  = mFX->GetParameterByName(0, "gSpecularMtrl");
	mhSpecularLight = mFX->GetParameterByName(0, "gSpecularLight");
	mhSpecularPower = mFX->GetParameterByName(0, "gSpecularPower");
	mhEyePos        = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld         = mFX->GetParameterByName(0, "gWorld");
	mhTex0          = mFX->GetParameterByName(0, "gTex0");
	mhTex1          = mFX->GetParameterByName(0, "gTex1");
	mhTex2          = mFX->GetParameterByName(0, "gTex2");
	mhBlendMap      = mFX->GetParameterByName(0, "gBlendMap");
}
Exemplo n.º 11
0
// NOTE: The texture list needs to change to be device independent...
void CD3DRigidMesh::Render(D3DMATRIX& WorldTransform,CD3DRenderStyle* pRenderStyle,vector<LPDXTexture>& TextureList)
{
	if (pRenderStyle == NULL)  return;

	g_RenderStateMgr.SetTransform(D3DTS_WORLDMATRIX(0), &WorldTransform);
	PD3DDEVICE->SetRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE);
	PD3DDEVICE->SetRenderState(D3DRS_LIGHTING,TRUE);
	PD3DDEVICE->SetRenderState(D3DRS_NORMALIZENORMALS,FALSE);

	//m_VBController.SetStreamSources();

	if( (g_EffectMgr.GetEnabled()) && (g_EffectMgr.GetEffect() != NULL) )
	{
		ID3DXEffect *pEffect = g_EffectMgr.GetEffect();

		g_EffectMgr.UploadVertexDecl();
		m_VBController.SetStreamSources();

		// This is a temp HACK
		//g_RenderStateMgr.SetRenderStyleStates(pRenderStyle,0,TextureList);

		pEffect->SetTechnique(g_EffectMgr.GetTechnique());

		D3DXMATRIX matD3DX( *g_RenderStateMgr.GetTransform(D3DTS_WORLD));
		D3DXMATRIX MatWorld;
		D3DXMatrixTranspose(&MatWorld, &matD3DX);
		pEffect->SetMatrix("worldMatrix", &MatWorld);

		//view proj
		D3DXMATRIX MatView;
		PD3DDEVICE->GetTransform(D3DTS_VIEW, &MatView);

		pEffect->SetMatrix("viewMatrix", &MatView);

		D3DXMATRIX MatProj;
		PD3DDEVICE->GetTransform(D3DTS_PROJECTION, &MatProj);

		pEffect->SetMatrix("projMatrix", &MatProj);

		D3DXMATRIX MatViewProj;
		D3DXMatrixMultiply(&MatViewProj, &MatView, &MatProj);
		D3DXMatrixTranspose(&MatViewProj, &MatViewProj);

		D3DXMATRIX matD3DX2( MatViewProj);
		pEffect->SetMatrix("viewProjMatrix", &matD3DX2);

		float fTemp[4];
		fTemp[0] = g_EffectMgr.GetPosition()->x;
		fTemp[1] = g_EffectMgr.GetPosition()->y;
		fTemp[2] = g_EffectMgr.GetPosition()->z;
		fTemp[3] = 0.0f;
		pEffect->SetFloatArray("CameraPosition", fTemp, 4);

		char szBuf[32];
		ZeroMemory(szBuf, 32);

		for (uint32 iTexStage = 0; iTexStage < 4; ++iTexStage)
		{
			if(TextureList[iTexStage])
			{			
				PD3DDEVICE->SetTexture(iTexStage, TextureList[iTexStage]->GetTexture());

				sprintf(szBuf, "texture%d", iTexStage);
				D3DXHANDLE hHandle = pEffect->GetParameterByName(NULL, szBuf);

				HRESULT hrTex = pEffect->SetTexture(hHandle, TextureList[iTexStage]->GetTexture());
				if(FAILED(hrTex))
				{
					OutputDebugString("Error sending texture to Effect!");
				}
			}
		}

		UINT nPasses;
		pEffect->Begin(&nPasses, 0);

		for(int n = 0; n < (int)nPasses; ++n)
		{
			pEffect->BeginPass(n);
			m_VBController.Render(0,0,m_iVertCount,m_iPolyCount); 
			pEffect->EndPass();
		}

		pEffect->End();

		PD3DDEVICE->SetTexture(0, NULL);
		PD3DDEVICE->SetTexture(1, NULL);
		PD3DDEVICE->SetTexture(2, NULL);
		PD3DDEVICE->SetTexture(3, NULL);
	}
	else
	{
		g_EffectMgr.UploadVertexDecl();
		m_VBController.SetStreamSources();
	
		for (uint32 iRenderPass = 0; iRenderPass < pRenderStyle->GetRenderPassCount(); ++iRenderPass) 
		{
			LPDIRECT3DVERTEXSHADER9 VertexShader = pRenderStyle->GetVertexShader(iRenderPass,0);
			
			RSD3DRenderPass D3DRenderPass;

			if (VertexShader) 
			{																		// Using a custom vertex shader...
				if (FAILED(g_RenderStateMgr.SetVertexShader(VertexShader)))							{ assert(0); return; }
				if (!pRenderStyle->GetRenderPass_D3DOptions(iRenderPass,&D3DRenderPass))			{ assert(0); return; }
	//			if (!g_RenderStateMgr.SetVertexShaderConstants(pRenderStyle, &D3DRenderPass,0))		{ assert(0); return; } 
			}
			else 
			{	
				
				// Using the standand pipe...
				/*
				if (!m_VBController.getVertexFormat(0))	return;										// This is a non fixed function pipe VB - bail out...
				if (FAILED(g_RenderStateMgr.SetFVF(m_VBController.getVertexFormat(0))))	
				{ 
					assert(0); 
					return; 
				} 
				*/
				
			}

			g_RenderStateMgr.SetRenderStyleStates(pRenderStyle,iRenderPass,TextureList);			// Set your render states with the render state mgr...

			//g_EffectMgr.UploadVertexDecl();
			m_VBController.Render(0,0,m_iVertCount,m_iPolyCount); 
		}
	}

	D3DXMATRIX mIdentity; D3DXMatrixIdentity(&mIdentity);										// Reset our World Matrix...
	g_RenderStateMgr.SetTransform(D3DTS_WORLDMATRIX(0),&mIdentity);
	PD3DDEVICE->SetRenderState(D3DRS_LIGHTING,FALSE);
	PD3DDEVICE->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
	PD3DDEVICE->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
	PD3DDEVICE->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
	PD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
	PD3DDEVICE->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
}
Exemplo n.º 12
0
void MGEhud::draw()
{
    std::map<std::string, MGEhud::hud_id>::const_iterator i;
    IDirect3DStateBlock9 *stateSaved;

    device->CreateStateBlock(D3DSBT_ALL, &stateSaved);

    D3DXVECTOR4 *vbase;
    HRESULT hr = vbHUD->Lock(0, 0, (void**)&vbase, D3DLOCK_DISCARD);
    if(hr != D3D_OK || vbase == 0)
        return;

    for(i = element_names.begin(); i != element_names.end(); ++i)
    {
        const Element *e = &elements[i->second];

        if(e->enabled)
        {
            float x0 = e->x, x1 = e->x + e->xscale * e->w;
            float y0 = e->y, y1 = e->y + e->yscale * e->h;

            // Correct for D3D9 pixel offset
            x0 -= 0.5; y0 -= 0.5; x1 -= 0.5; y1 -= 0.5;

            D3DXVECTOR4 *v = vbase + 8 * i->second;
            v[0] = D3DXVECTOR4(x0, y1, 0, 1);
            v[1] = D3DXVECTOR4(0, 1, 0, 0);
            v[2] = D3DXVECTOR4(x0, y0, 0, 1);
            v[3] = D3DXVECTOR4(0, 0, 0, 0);
            v[4] = D3DXVECTOR4(x1, y1, 0, 1);
            v[5] = D3DXVECTOR4(1, 1, 0, 0);
            v[6] = D3DXVECTOR4(x1, y0, 0, 1);
            v[7] = D3DXVECTOR4(1, 0, 0, 0);
        }
    }

    vbHUD->Unlock();

    device->SetFVF(fvfHUD);
    device->SetStreamSource(0, vbHUD, 0, 32);
    device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

    for(i = element_names.begin(); i != element_names.end(); ++i)
    {
        const Element *e = &elements[i->second];

        if(e->enabled)
        {
            ID3DXEffect *effect = e->effect ? e->effect : effectStandard;
            D3DXHANDLE ehTex = effect->GetParameterByName(0, "tex");
            UINT passes;

            effect->SetTexture(ehTex, e->texture);
            effect->Begin(&passes, D3DXFX_DONOTSAVESTATE);
            effect->BeginPass(0);
            device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4 * i->second, 2);
            effect->EndPass();
            effect->End();
        }
    }

    stateSaved->Apply();
    stateSaved->Release();
}
Exemplo n.º 13
0
void SpotlightDemo::buildFX()
{
	// Create the FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "spotlight.fx", 
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech           = mFX->GetTechniqueByName("SpotlightTech");
	mhWVP            = mFX->GetParameterByName(0, "gWVP");
	mhWorldInvTrans  = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhEyePos         = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld          = mFX->GetParameterByName(0, "gWorld");
	mhAmbientLight   = mFX->GetParameterByName(0, "gAmbientLight");
	mhDiffuseLight   = mFX->GetParameterByName(0, "gDiffuseLight");
	mhSpecLight      = mFX->GetParameterByName(0, "gSpecLight");
	mhLightPosW      = mFX->GetParameterByName(0, "gLightPosW");
	mhLightDirW      = mFX->GetParameterByName(0, "gLightDirW");
	mhAttenuation012 = mFX->GetParameterByName(0, "gAttenuation012");
	mhAmbientMtrl    = mFX->GetParameterByName(0, "gAmbientMtrl");
	mhDiffuseMtrl    = mFX->GetParameterByName(0, "gDiffuseMtrl");
	mhSpecMtrl       = mFX->GetParameterByName(0, "gSpecMtrl");
	mhSpecPower      = mFX->GetParameterByName(0, "gSpecPower");
	mhSpotPower      = mFX->GetParameterByName(0, "gSpotPower");
}
Exemplo n.º 14
0
/**
 *	This method loads a model's dyes, if it has them. If multipleMaterials is
 *	true, then it calls the derived model to search for searches for material
 *	names in its bulk. Otherwise the dyes are read as if for a billboard model,
 *	which can have only one material (and thus dyes must each be composited).
 */
int Model::readDyes( DataSectionPtr pFile, bool multipleMaterials )
{
	int dyeProduct = 1;

	// read our own dyes
	std::vector<DataSectionPtr> vDyeSects;
	pFile->openSections( "dye", vDyeSects );
	for (uint i = 0; i < vDyeSects.size(); i++)
	{
		DataSectionPtr pDyeSect = vDyeSects[i];

		std::string matterName = pDyeSect->readString( "matter", "" );
		std::string replaces = pDyeSect->readString( "replaces", "" );

		//Ignore any empty "dye" sections
		if ((matterName == "") && (replaces == ""))
			continue;

		// see if we already have a matter of that name


		Matters::iterator miter = matters_.begin();
		for (; miter != matters_.end(); ++miter)
		{
			if ((*miter)->name_ == matterName)
				break;
		}

		if (miter == matters_.end())
		{
			matters_.push_back( new Matter( matterName, replaces ) );
			miter = matters_.end() - 1;
		}

		// set it up
		Matter * m = *miter;
		m->replaces_ = replaces;

		// get all instances of replaces from the visual,
		// and set the default tint from the original material
		if (multipleMaterials)	// not for billboards
		{
			if (this->initMatter( *m ) == 0)
			{
				//ERROR_MSG( "Model::readDyes: "
				//	"In model \"%s\", for dye matter \"%s\", "
				//	"the material id \"%s\" isn't in the visual\n",
				//	resourceID_.c_str(), matterName.c_str(), replaces.c_str() );

				continue;
			}
		}
		else					// for billboards
		{
			//miter->second.tints_["Default"]->oldMaterial_->textureFactor( 0 );
		}

		// add the other tints
		std::vector<DataSectionPtr> vTintSects;
		pDyeSect->openSections( "tint", vTintSects );
		for (uint j = 0; j < vTintSects.size(); j++)
		{
			DataSectionPtr pTintSect = vTintSects[j];

			std::string tintName = pTintSect->readString( "name", "" );
			if (tintName.empty())
			{
				//ERROR_MSG( "Model::readDyes: "
				//	"In model %s, for dye matter %s, "
				//	"tint section index %d has no name.\n",
				//	resourceID_.c_str(), matterName.c_str(), j );
				continue;
			}

			// if it's already there then use that one
			Matter::Tints::iterator titer = m->tints_.begin();
			for (; titer != m->tints_.end(); ++titer)
			{
				if ((*titer)->name_ == tintName)
					break;
			}

			// Create if missing
			if (titer == m->tints_.end())
			{
				
				m->tints_.push_back( new Tint( tintName ) );
				titer = m->tints_.end() - 1;
			}

			TintPtr t = *titer;

			// if it's not a billboard...
			if (multipleMaterials)
			{
				// clear source dyes that we don't use
				t->sourceDyes_.clear();

				// read the material
				DataSectionPtr matSect = pTintSect->openSection( "material" );
				if (!this->initTint( *t, matSect ))
				{
					WARNING_MSG( "Model::readDyes: "
						"In model %s, for dye matter %s tint %s, "
						"there %s <material> section.\n",
						resourceID_.c_str(), matterName.c_str(), tintName.c_str(),
						(!!matSect) ? "was a problem loading the" : "is no" );
				}

				// read the properties
				std::vector<DataSectionPtr> vPropSects;
				pTintSect->openSections( "property", vPropSects );
				for (uint k = 0; k < vPropSects.size(); k++)
				{
					DataSectionPtr pPropSect = vPropSects[k];

					std::string propName = pPropSect->readString( "name", "" );
					if (propName.empty())
					{
						//ERROR_MSG( "Model::readDyes: "
						//	"In model %s, for dye matter %s tint %s, "
						//	"property section index %d has no name.\n",
						//	resourceID_.c_str(), matterName.c_str(),
						//	tintName.c_str(), k );
						continue;
					}

					s_propCatalogueLock_.grab();
					std::stringstream catalogueName;
					catalogueName << matterName << "." << tintName << "." << propName;
					PropCatalogue::iterator pit =
						s_propCatalogue_.find( catalogueName.str().c_str() );
					if (pit == s_propCatalogue_.end())
					{
						{
							memoryCounterSub( modelGlobl );
							memoryClaim( s_propCatalogue_ );
						}
						pit = s_propCatalogue_.insert(
							std::make_pair( catalogueName.str().c_str(), Vector4() ) );
						{
							memoryCounterAdd( modelGlobl );
							memoryClaim( s_propCatalogue_ );
						}
					}

					DyeProperty dp;
					dp.index_ = pit - s_propCatalogue_.begin();
					s_propCatalogueLock_.give();
					dp.controls_ = pPropSect->readInt( "controls", 0 );
					dp.mask_ = pPropSect->readInt( "mask", 0 );
					dp.future_ = pPropSect->readInt( "future", 0 );
					dp.default_ = pPropSect->readVector4( "default",
						Vector4(0,0,0,0) );

					if (dp.mask_ == -1) dp.mask_ = 0;
					// look for a corresponding D3DXHANDLE
					// (if newMaterial is NULL, won't have any props anyway)
					if ( t->effectMaterial_->pEffect() )
					{
						ID3DXEffect * effect = t->effectMaterial_->pEffect()->pEffect(); 
						D3DXHANDLE propH = effect->GetParameterByName( NULL, propName.c_str() ); 
	
						if (propH != NULL)
						{
							Moo::EffectPropertyFunctorPtr factory = Moo::g_effectPropertyProcessors.find( "Vector4" )->second; 
							Moo::EffectPropertyPtr modifiableProperty = factory->create( propH, effect ); 
							modifiableProperty->be( dp.default_ ); 
							t->effectMaterial_->replaceProperty( propName, modifiableProperty ); 

							dp.controls_ = (int)propH;
							dp.mask_ = -1;
						}
					}

					uint l;
					for (l = 0; l < t->properties_.size(); l++)
					{
						if (t->properties_[l].index_ == dp.index_) break;
					}
					if (l < t->properties_.size())
						t->properties_[l] = dp;
					else
						t->properties_.push_back( dp );

					// end of properties
				}
			}
			// if it's a billboard...
			else
			{
				t->properties_.clear();
				t->sourceDyes_.clear();


				// read the source dye selections
				std::vector<DataSectionPtr> vSourceDyes;
				pTintSect->openSections( "dye", vSourceDyes );
				for (uint k = 0; k < vSourceDyes.size(); k++)
				{
					DataSectionPtr pSourceDye = vSourceDyes[k];
					DyeSelection dsel;

					if (!this->readSourceDye( pSourceDye, dsel ))
					{
						//ERROR_MSG( "Model::readDyes: "
						//	"In model %s, for dye matter %s tint %s, "
						//	"source dye selection section index %d is missing "
						//	"either a matter ('%s') or tint ('%s') name.\n",
						//	resourceID_.c_str(), matterName.c_str(),
						//	tintName.c_str(), k,
						//	dsel.matterName_.c_str(), dsel.tintName_.c_str() );
					}

					t->sourceDyes_.push_back( dsel );
				}


			}

			// end of tints
		}

		// keep a running total of the dye product
		dyeProduct *= m->tints_.size();

		MF_ASSERT( dyeProduct );

		// end of matters (dyes)
	}

	// end of method
	return dyeProduct;
}
Exemplo n.º 15
0
void StencilMirrorDemo::buildFX()
{
	ID3DXBuffer *errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, L"../src/chap13/StencilMirror/DirLightTex.fx",
		0, 0, D3DXSHADER_DEBUG, 0, &mFX, &errors));
	if (errors)
		MessageBoxA(0, (char*)errors->GetBufferPointer(), 0, 0);

	mhTech          = mFX->GetTechniqueByName("DirLightTexTech");
	mhWVP           = mFX->GetParameterByName(0, "gWVP");
	mhWorldInvTrans = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhLightVecW     = mFX->GetParameterByName(0, "gLightVecW");
	mhDiffuseMtrl   = mFX->GetParameterByName(0, "gDiffuseMtrl");
	mhDiffuseLight  = mFX->GetParameterByName(0, "gDiffuseLight");
	mhAmbientMtrl   = mFX->GetParameterByName(0, "gAmbientMtrl");
	mhAmbientLight  = mFX->GetParameterByName(0, "gAmbientLight");
	mhSpecularMtrl  = mFX->GetParameterByName(0, "gSpecularMtrl");
	mhSpecularLight = mFX->GetParameterByName(0, "gSpecularLight");
	mhSpecularPower = mFX->GetParameterByName(0, "gSpecularPower");
	mhEyePos        = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld         = mFX->GetParameterByName(0, "gWorld");
	mhTex           = mFX->GetParameterByName(0, "gTex");
}
Exemplo n.º 16
0
void PropsDemo::buildFX()
{
	// Create the generic Light & Tex FX from a .fx file.
	ID3DXBuffer* errors = 0;
	HR(D3DXCreateEffectFromFile(gd3dDevice, "DirLightTex.fx", 
		0, 0, 0, 0, &mFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhTech            = mFX->GetTechniqueByName("DirLightTexTech");
	mhWVP             = mFX->GetParameterByName(0, "gWVP");
	mhWorldInvTrans   = mFX->GetParameterByName(0, "gWorldInvTrans");
	mhMtrl            = mFX->GetParameterByName(0, "gMtrl");
	mhLight           = mFX->GetParameterByName(0, "gLight");
	mhEyePosW         = mFX->GetParameterByName(0, "gEyePosW");
	mhWorld           = mFX->GetParameterByName(0, "gWorld");
	mhTex             = mFX->GetParameterByName(0, "gTex");


	// Create the grass FX from a .fx file.
	HR(D3DXCreateEffectFromFile(gd3dDevice, "grass.fx", 
		0, 0, 0, 0, &mGrassFX, &errors));
	if( errors )
		MessageBox(0, (char*)errors->GetBufferPointer(), 0, 0);

	// Obtain handles.
	mhGrassTech     = mGrassFX->GetTechniqueByName("GrassTech");
	mhGrassViewProj = mGrassFX->GetParameterByName(0, "gViewProj");
	mhGrassTex      = mGrassFX->GetParameterByName(0, "gTex");
	mhGrassTime     = mGrassFX->GetParameterByName(0, "gTime");
	mhGrassEyePosW  = mGrassFX->GetParameterByName(0, "gEyePosW");
	mhGrassDirToSunW= mGrassFX->GetParameterByName(0, "gDirToSunW");

	HR(mGrassFX->SetTechnique(mhGrassTech));
	HR(mGrassFX->SetTexture(mhGrassTex, mGrassTex));
}